题目描述
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
示例:
输入:"tactcoa"
输出:true(排列有"tacocat"、"atcocta",等等)
题目链接: https://leetcode-cn.com/problems/palindrome-permutation-lcci/
思路
判断一个字符串其是否为某个回文串的排列之一,也就是判断该字符串是否能调整为回文串。如果一个字符串经过调整能变成回文串,那么统计该字符串中每个字符出现的次数,那么最多只会有 1 个字符的出现次数为奇数。例如,abab
能调整为回文串,a
,b
的出现次数均为偶数;ababc
能调整为回文串,只有一个字符 c
的出现次数为奇数;ababcd
不能调整为回文串,因为有 2 个字符 c
和 d
的出现次数为奇数。所以,我们使用哈希表统计每个字符出现的次数,然后统计奇数的个数。如果奇数的个数小于等于 1,则能调整为回文串,返回 true,否则返回 false. 代码如下:
class Solution {
public:
bool canPermutePalindrome(string s) {
if(s.empty()) return true;
vector<int> hash(256, 0);
for(int i=0; i<s.length(); i++){
hash[s[i]]++;
}
int oddNums = 0;
for(int i=0; i<hash.size(); i++){
if(hash[i]%2!=0) oddNums++;
}
if(oddNums>1) return false;
else return true;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)