这个题目要求我们在给出的字符串中找到最长的回文数,先上代码:
int longestPalindrome(char* s) {
int vb[128] = {0};
int count = 0;
int l = strlen(s);
// 遍历字符串,记录每一个字符出现的次数
for ( int i=0; i < l; i++ ) {
vb[s[i]]++;
}
// 遍历 定义的计数的数组
for ( int i=0; i< 128; i++ ) {
count += vb[i] - (vb[i] % 2); // 如果该字符出现的次数为奇数次,就减一再加
}
return count +( count != strlen(s) ) ; // 最后返回的是 最长的字符串长度
}
对于如何找到最长的回文字符串要分为两种情况,一种是偶数,另一种就是奇数
那么我们就要搞清楚如果这个字符出现的次数为偶数时该怎么处理,而出现的次数为奇数次时又该怎么处理
这里我们对于偶数次的字符直接采取不处理,直接加和的原则,因为要求回文串,所以偶数次的字符并不需要处理
但是奇数次的字符就要进行额外的处理,因为当奇数次的字符出现时,我们必须要保证整个字符串中只有一个字符出现的次数为奇数次。也就是说,当出现了n种奇数次的字符时,返回的长度就是原长 - n + 1 。
所以在上述的代码中,我们在遍历vb数组时,计算count的数值要对该字符个数进行取余再减去余数的操作,这样对于偶数来说相当于没有处理,但是对于奇数来说就是进行了减一的操作
但是这样遍历出来的count数值始终时 原长 - n , 而不是 原长 - n + 1 。
所以在返回最终的结果时,进行一个比较的操作,当count数值 不等于 原长时,证明该数组中有奇数次的字符出现,那么令上述的不等式结果为 1 ,就可以保证最终保留了一个奇数次的字符,就是最终的字符串长度了。
简单来讲就是,把原来字符串中的所有字符出现的次数全部转化成偶数,再保证出现了奇数次的字符只保留一个,就是最终的回文串长度了。

340

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



