给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
示例1:
输入:"tactcoa"
输出:true(排列有"tacocat"、"atcocta",等等)
来源:力扣(LeetCode)
回文排列有两种情况:
1)所有的字母都能两两配对,都是偶数;
比如 “abba”,“aabbaa”。
2)只有一个字母的数量是奇数。
比如“aba”,“abcba”,“acbca”。
这两种情况的并集就是: 最多只有一个字母的数量是奇数。
当出现次数为奇数的字母大于1时,那么该字母串不能构成回文排列。
1)先将输入的字母串按顺序排列,从第1个字母开始匹配
2)如果相等,次数加1;
3)否则判断出现次数是否为奇数,为奇数则计算出现奇数的情况加1;
4)重置出现次数为1,并从当前字母重新开始匹配;
5)判断出现奇数的情况次数是否大于1,是则退出,否则重新执行2)~5)直到字母串末尾。
6)判断最后出现的字母的出现次数是否奇数;
步骤6)这里有两种情况:(1)末尾的字母仅出现1次:c=1,此时它出现的次数为奇数;(2)该字母连续出现直到字母串末尾:exchange=False,判断其出现的次数是否为奇数,是则记录。
7)判断最终出现次数为奇数的字母个数:大于1则不能构成回文排列;否则可以。
代码:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
"""
Created on Mon Jul 27 22:17:17 2020
@author: MRN_6
@github: https://github.com/WowlNAN
@blog: https://blog.csdn.net/qq_21264377
"""
def a(s):
a=s
a=sorted(a)
if a[0]==a[-1]:
return True
b=a[0]
c=0
e=0
d=''
l=len(a)
exchange=False
for i in range(l):
d=a[i]
if b==d:
c+=1
exchange=False
else:
exchange=True
if c==1:
e+=1
elif c%2==1:
e+=1
b=d
c=1
if e>1:
return False
if c==1 or (not exchange and c%2==1):
e+=1
if e>1:
return False
else:
return True
print(a('carerac'))