力扣(leetcode) 409. 最长回文串 ------- 提交击败了100%的Python3用户
原创
©著作权归作者所有:来自51CTO博客作者深度不学习的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目在这:https://leetcode-cn.com/problems/longest-palindrome/
思路分析:
题目要求找到可以组成的最长的回文串。
注意这里是可以对题目中所给的字符串进行重新排列组合的。
首先我们建立所给字符串的哈希表。
经过不断的试错总结出一下规律:
- 对于出现偶数次的字符,必定可以排序成回文字符。
- 对于奇数字符:
- 如果字符串中没有出现次数为1次的字符,且仅有一个出现奇数次数的字符,则回文字符串个数为 n(有一个可以放在中间)。
- 如果字符串中没有出现次数为1次的字符,且有多个出现奇数次数的字符,则仅有其中一个奇数次数字符为n,其余为n-1 次。
- 若字符串中有出现次数为1次的字符,则所有其他出现为奇数次数的字符串,都可组成n-1次回文字符。
完整代码
class Solution:
def longestPalindrome(self, s: str) -> int:
from collections import Counter
temp = False # 标志位,如果哈希表中有1的话为True 否则为False
hash_map = Counter(s)
print(hash_map)
res = 0
for j in hash_map:
if hash_map[j] == 1:
temp = True
res +=1
break
for i in hash_map: # 遍历 key
if hash_map[i] >1 and hash_map[i] % 2==0:
res += hash_map[i]
if hash_map[i] >1 and hash_map[i] % 2!=0:
if temp:
res += hash_map[i] -1
else:
res += hash_map[i]
temp = True
print(res)
return
不断试错后提交: