小F的相似密码问题
问题描述
小F有两个银行卡密码,她可以对其中一个密码进行最多 k 次操作。每次操作中,她可以将密码的每个字符都加一(例如,
"abc"
变成"bcd"
,"zzz"
变成"aaa"
)。她想知道,通过最多 k 次这样的操作,两个密码能否变得相等。如果能,则她认为这两个密码是相似的。
思路解析
- 首先我们可以假设这两个密码是可以通过不断加一操作得到相等的。
- 在这个假设的前提下,我们可以计算出count为得到相等字符串的操作次数。
- 如果count>k,就无法通过最多k次操作达成目的,返回False
- 当count<=k,我们再核对每一位是否都是相差count,如果有一组相差不为count,则返回False
- 以上情况均不存在时,返回True,即可以通过至多k次操作使两个密码变得相等
注意事项
- 对每个密码中单个字母比较需要用ord来获得他的数字表示,无法直接相减
解题步骤
1.在假设前提下得出count的大小
count=max(ord(t[0]),ord(s[0]))-min(ord(t[0]),ord(s[0]))
2.对比count与k的大小,如果count>k,则无需继续比较
if count>k:
return False
3.接下来比较两串密码是否可以通过不断增加一相等(这里需要分类讨论两个密码串第一个数字大小不同的情况)
if ord(t[0])<ord(s[0]):
for i in range(len(t)):
if ord(t[i])+count!=ord(s[i]):
return False
else:
for i in range(len(t)):
if ord(s[i])+count!=ord(t[i]):
return False
4.不满足上述情况下,则返回True
return True
代码示例
def solution(n: int, k: int, s: str, t: str) -> bool:
count=max(ord(t[0]),ord(s[0]))-min(ord(t[0]),ord(s[0]))
if count>k:
return False
if ord(t[0])<ord(s[0]):
for i in range(len(t)):
if ord(t[i])+count!=ord(s[i]):
return False
else:
for i in range(len(t)):
if ord(s[i])+count!=ord(t[i]):
return False
# write code here
return True
if __name__ == '__main__':
print(solution(4, 3, "abcd", "cdef") == True)
print(solution(4, 1, "abcd", "cdef") == False)
print(solution(5, 2, "abcde", "cdefg") == True)
总结时刻
这道题需要注意到,对python中字符串内字符操作需要用到ord来获得相应数字,在题目没有明确表示两密码顺序情况下应当分类讨论(在AI代码中可以通过相减取模的办法来解决分类讨论问题)