回文排列

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。

回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。

回文串不一定是字典当中的单词。

示例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'))

猜你喜欢

转载自blog.csdn.net/qq_21264377/article/details/107623150