程序员面试金典---2

回文排列

思路:回文排列的特征之一就是如果字符串中每个字符的个数都是两个,或者只有只有一个字符个数为奇数个。只有上述两种结果。

class Solution:
    def canPermutePalindrome(self, s: str) -> bool:
        // 将字符串转成个数字典
        s_dic = Counter(s)
        // 标识几个字符出现为奇数个的字符,0表示没有,1出现一次
        flag = 0
        // 循环
        for i in s_dic:
            // 如果出现了奇数个的字符
            if s_dic[i] % 2 != 0:
                // 置一
                flag += 1
        // 如果大于一个
        if flag > 1:
            return False
        return True

一次编辑

思路:

假设firstsecond的长度分别是mn

如果firstsecond只需要一次编辑,只有三种情况:

  1. first插入一个字符,此时n-m=1secondfirst多一个字符,其余字符都相同
  2. first中删除一个字符得到second,此时m-n=1firstsecond多一个字符,其余字符都相同。
  3. first中的一个字符替换成不同的字符得到second,此时m=nfirstsecond恰好有一个字符不同。
class Solution:
    def oneEditAway(self, first: str, second: str) -> bool:
        m, n = len(first),len(second)
        if m < n:
            return self.oneEditAway(second, first)
        
        if m - n > 1:
            return False

        for i, (x, y) in enumerate(zip(first, second)):
            if x != y:
                return first[i + 1:] == second[i + 1:] if m == n else first[i + 1:] == second[i:]
        return True
posted @ 2023-04-09 22:36  楸枰~  阅读(20)  评论(0)    收藏  举报