最长回文串
问题描述:
给出一个包含大小写字母的字符串。求出由这些字母构成的最长的回文串的长度是多少。
数据是大小写敏感的,也就是说,"Aa" 并不会被认为是一个回文串。
样例给出 s = "abccccdd" 返回 7
一种可以构建出来的最长回文串方案是 "dccaccd"。
解题思路:
先对给定的字符串排序,然后比较相邻元素是否相同,计算其相同个数,然后整除2加到事先设定的ss中,遍历完毕后,最后结果加1即可。
需要注意的细节分别有:
1、字符串长度为0
2、字符串长度为1
3、字符串中只有一种字符时,若为偶数,则最后结果不需要加1;若为奇数,返回字符串的长度即可。
代码实现:
class Solution {
public:
/**
* @param s a string which consists of lowercase or uppercase letters
* @return the length of the longest palindromes that can be built
*/
int longestPalindrome(string& s) {
// Write your code here
if(s.length()==0) return 0;
if(s.length()==1) return 1;
sort(s.begin(),s.end());
int ss=0;
int a=1;
int i=0;
int j=1;
bool flag=0;//判断字符串中是否只有一种字符
while(i<s.length()&&j<s.length()){
if(s[i]==s[j]&&j<s.length()-1){
a++;
j++;
}
if(s[i]==s[j]&&j==(s.length()-1)){
a++;
if(i==0&&(a%2==1)) ss++;//字符串中只有一种元素并且个数为奇数
ss+=((int)a/2)*2;
return ss+flag;
}
if(s[i]!=s[j]){
ss+=((int)a/2)*2;
i=j;
j++;
a=1;
flag=1;//字符串中不止一种字符
}
}
return ss+flag;
}
};
public:
/**
* @param s a string which consists of lowercase or uppercase letters
* @return the length of the longest palindromes that can be built
*/
int longestPalindrome(string& s) {
// Write your code here
if(s.length()==0) return 0;
if(s.length()==1) return 1;
sort(s.begin(),s.end());
int ss=0;
int a=1;
int i=0;
int j=1;
bool flag=0;//判断字符串中是否只有一种字符
while(i<s.length()&&j<s.length()){
if(s[i]==s[j]&&j<s.length()-1){
a++;
j++;
}
if(s[i]==s[j]&&j==(s.length()-1)){
a++;
if(i==0&&(a%2==1)) ss++;//字符串中只有一种元素并且个数为奇数
ss+=((int)a/2)*2;
return ss+flag;
}
if(s[i]!=s[j]){
ss+=((int)a/2)*2;
i=j;
j++;
a=1;
flag=1;//字符串中不止一种字符
}
}
return ss+flag;
}
};
A题感悟:
细节决定成败!要想数据全部通过就得考虑到边边角角。学会了用sort函数对字符串排序。