题目描述
考察知识
字符串、回文、集合
解题思路
- 首先明确考察的是回文串,回文串指的是正反两个方向都一样的单词或短语。
- 由于题目中给出回文串中的字符不一定是字典中的字母,因此不考虑使用位运算进行化简
- 回文串的排列,因此不需要考虑顺序,所以决定使用set集合来解决问题,这样解决会优于使用map哈希表
- 回文串的排列中如果串的长度是奇数,那么一定会有一个字符出现了奇数次,其余的出现偶数次,相反如果长度是偶数,那么所有的字符出现次数都是偶数次,具体见代码及注释
解题代码
class Solution {
public:
bool canPermutePalindrome(string s) {
// 由于只需要记录出现的奇数和偶数次两种状态,可以集合中的有无来标识
set<char> recoder;
set<char>::iterator iter;
// 遍历字符串
for (int i = 0; i < s.length(); i++) {
iter = recoder.find(s[i]);
//集合中有此字符,删除
if (iter != recoder.end()) {
recoder.erase(s[i]);
}
// 集合中没有本字符,填入
else {
recoder.emplace(s[i]);
}
}
if (s.length() % 2 == 0) {
// 长度为偶数
return recoder.empty();
}
else {
// 长度为奇数
if (recoder.size() == 1) {
return true;
}
else
{
return false;
}
}
}
};
知识沉淀
- 回文串:正反两个方向都一样的单词或短语。
- 当需要使用无序的数据结构,并且每一个key只需要考虑两种状态时,考虑使用集合(set)