给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
示例1:
输入:"tactcoa"
输出:true(排列有"tacocat"、"atcocta",等等)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-permutation-lcci
分析:可建立一个ascll码值长度的访问表,回文串无非有两种情况:一种所有字符出现次数均为偶数,另一种则仅有中间字符出现次数为奇数,其余也皆为偶数;计数后模2进行判断即可。
代码:
class Solution {
public:
bool canPermutePalindrome(string s) {
int len=s.size();
int vis[128];
memset(vis,0,sizeof(vis));
for(int i=0;i<len;i++){
int w=(int)s[i];
vis[w]++;
}
int cnt=0;
for(int i=0;i<128;i++){
if(vis[i]%2) cnt++;
if(cnt>1) return false;
}
return true;
}
};
复杂度分析:
时间复杂度 O(N): 其中 N 为字符串长度;哈希表统计字符数量迭代 N 次,判断是否为回文串最多迭代 N 次,总体使用 O(N + N) = O(N)时间;
空间复杂度 O(N) : 哈希计数表 vis 使用O(N) 大小的额外空间;