190.小F的相似密码问题
题目用python通过,如有需要请用ai转义成其他代码,由于这道题代码没有太复杂,看看自己写也成。
题目: 小F有两个银行卡密码,她可以对其中一个密码进行最多 k 次操作。每次操作中,她可以将密码的每个字符都加一(例如,"abc" 变成 "bcd","zzz" 变成 "aaa")。她想知道,通过最多 k 次这样的操作,两个密码能否变得相等。如果能,则她认为这两个密码是相似的。
解题思路:
第一思路:
暴力模拟,直接干。 让marscode帮我们生成代码。 豆包的思路直接每个位置进行匹配,而且豆包理解成每个字母需要修改, 我们的题目要求同时修改, 看最多k次能否满足要求。豆包的代码当然不能满足题意。
给豆包指出来错误, 让豆包再修改一下。
但是这次豆包还是没有修改对, 这是犯了什么错误呢? 先看看豆包怎么说:明白了,你的意思是只需要判断两个密码是否可以通过最多 k 次操作变得完全相同,而不需要逐位考虑字符的差异。也就是说,我们只需要判断两个密码是否可以通过最多 k 次操作变得完全相同。
这里的k次操作, 豆包的理解还是每个字符操作一下, 而不是整体操作。 那么指出问题让豆包生成一下。 但是豆包没有悔改,还是第一次的代码一点没变, 歧视我了!!!
再开一个豆包, 再试一下。这次只给出了思路, 并没有写代码, 那看下思路:计算从 s[i] 到 t[i] 需要的操作次数, 这里需要计算字符的差值,并考虑循环的情况, 例如:ord('c') - ord('a') = 2,这里需要处理循环的情况,计算差值并累加到 total_operations。 看着好像也有问题, 让豆包生成一下。
麻了,还是原来的代码。 那么我们只能自己写了。
第二思路:
再读一遍题目。 我们可以先循环k 次, 每一次都判断一下两个字符串是否完全相等。 如果完全相等, 那么就直接返回 true, 如果遍历完了 k 次还不同, 那么返回false 。 代码如下,这次操作的时间复杂度为O(nk)
def solution(n: int, k: int, s: str, t: str) -> bool:
i = 1
while i <= k:
for a, b in zip(s, t):
if ord(a) + i != ord(b):
break
else:
return True
i += 1
return False
上边的思路时间复杂度有点高, 那么我们可以优化一下,将时间复杂度降为 O(N)的。 观察一下有什么共同点。 如果每个位置字母的差值都相同, 且小于等于k ,那么可以直接返回true ,不用再遍历。 如果有一位的差值不同, 或者差值都相同,但是大于k, 那么此时直接返回false。 这样的话只需要一次遍历就可以解决这道问题。代码如下:
def solution(n: int, k: int, s: str, t: str) -> bool:
diff = abs(ord(s[0]) - ord(t[0]))
for i in range(1, n):
if diff != abs(ord(s[i]) - ord(t[i])):
return False
return diff <= k
哈哈, 其实对于python来说,还可以用all把循环写条件里,直接判断。 只有一行的代码:
def solution(n: int, k: int, s: str, t: str) -> bool:
return all(ord(s[i]) - ord(t[i]) == ord(s[0]) - ord(t[0]) for i in range(1, n)) and abs(ord(s[0]) - ord(t[0])) <= k
嘿嘿,这样就写完了, 总结一句, marscode还得练!!!