程序员面试金典---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
一次编辑
思路:
假设
first和second的长度分别是m和n。如果
first和second只需要一次编辑,只有三种情况:
- 往
first插入一个字符,此时n-m=1,second比first多一个字符,其余字符都相同- 从
first中删除一个字符得到second,此时m-n=1,first比second多一个字符,其余字符都相同。- 将
first中的一个字符替换成不同的字符得到second,此时m=n,first和second恰好有一个字符不同。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

浙公网安备 33010602011771号