190.小F的相似密码问题 | 豆包MarsCode AI刷题

9 阅读2分钟

小F的相似密码问题

问题描述

小F有两个银行卡密码,她可以对其中一个密码进行最多 k 次操作。每次操作中,她可以将密码的每个字符都加一(例如,"abc" 变成 "bcd""zzz" 变成 "aaa")。她想知道,通过最多 k 次这样的操作,两个密码能否变得相等。如果能,则她认为这两个密码是相似的。

思路解析

  1. 首先我们可以假设这两个密码是可以通过不断加一操作得到相等的。
  2. 在这个假设的前提下,我们可以计算出count为得到相等字符串的操作次数。
  3. 如果count>k,就无法通过最多k次操作达成目的,返回False
  4. 当count<=k,我们再核对每一位是否都是相差count,如果有一组相差不为count,则返回False
  5. 以上情况均不存在时,返回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代码中可以通过相减取模的办法来解决分类讨论问题)