在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
思路:我们用哈希表(映射都可以)记录下每个字符出现的次数。然后有以下几种情况:
- 如果个数为偶数,因为偶数可以拆到两边,所以直接加上偶数个数即可。
- 奇数,如果字符个数为奇数只有一个的话,我们将其放在中间即可。如果大于一个我们就将大的放中间,其余的减去一变成偶数放到两边即可。
代码:
int longestPalindrome(string s) {
unordered_map<char,int>key; for(auto ch:s) key[ch]++; int count =0,cnt=0,mid=0; int ans = 0; for(auto it=key.begin();it!=key.end();++it) {
if(it->second%2) //为奇数 {
mid = max(mid,it->second); //记录最大值 count++; //个数 cnt +=it->second; } if(it->second%2==0) //为偶数 ans +=it->second; } if(count==0) return ans; else if(count==1) return ans+cnt; else {
ans +=mid; cnt=cnt-mid-1*(count-1); //放到两边的是总的减去放到中间的,因//为每一个奇数都要减一,所以还要减去(count-1) return ans+cnt; } }
优化:我们发现如果是奇数的话只要加上其个数减去一即可。有因为在中间的可以不用减我们只要在后边特判加上一即可。
int longestPalindrome(string s) {
map<char,int> count; for(char ch:s)count[ch]++; int res=0; for(auto it:count){
if(it.second&1)res+=it.second-1;//加上奇数字符数-1 else res+=it.second;//加上偶数字符数 } return res<s.size()?res+1:res;//加上一个单字符放在中间 }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216307.html原文链接:https://javaforall.net
