题目
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
示例1:
输入:“tactcoa”
输出:true(排列有"tacocat"、“atcocta”,等等)
思路
首先判断回文排列,可以想象就是哈希表。如果为回文的重排列,那么我们首先判断字符串是奇数还是偶数
- 奇数:如果字符串是奇数,那么我们可以将字符串映射到哈希表中,将哈希表中是0的略过,偶数次也略过,因为这些可以构成回文串,问题是出现奇数次的字符,只能有一个,比如说’a’出现了3次或者5次,都可以,没问题,‘a’搭配其他出现偶数次的字符都可以构成回文串,但是不能既有出现3次的’a’和出现3次的’b’,这就歇逼了。
- 偶数:如果字符串是偶数,那么我们可以将字符串映射到哈希表中,将哈希表是0的略过,偶数次也略过,不同的是,不能出现奇数次出现的字符,比如说出现了3次的’a’,因为出现奇数次次数的字符不能再放在字符串中间了。所以遍历哈希表,只有有出现奇数次的字符,就返回false,遍历完也没有,就返回true。
bool canPermutePalindrome(char* s){
int len=strlen(s);
int map[128];
for(int i=0;i<128;i++){
map[i]=0;
}
for(int i=0;i<len;i++){
map[s[i]]++;
}
int OddCount=0; //奇数个数
int EvenCount=0; //偶数个数
if(len%2){
for(int i=0;i<128;i++){
if(map[i]==0)
;
else if(map[i]%2){ //出现次数如果是奇数
OddCount++; //奇数++
}
else{ //出现次数如果是偶数
EvenCount++; //偶数++
}
}
if(OddCount>1){
return false;
}
return true;
}
if(len%2==0){
for(int i=0;i<128;i++){
if(map[i]==0)
;
else if(map[i]%2)
return false;
else
;
}
}
return true;
}
本文介绍了一种算法,用于判断给定的字符串是否可以通过重新排列形成回文串。通过使用哈希表记录每个字符的出现次数,算法能够有效地区分字符串长度为奇数或偶数的情况,并据此判断其是否满足回文排列的条件。
1368

被折叠的 条评论
为什么被折叠?



