给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa"
不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7
思路:
用一个map<char,int> m存储字符串中所有字符的个数
设要返回的长度是len
遍历m,取每个元素的个数/2,得到每个元素成对的个数,再乘以2加到len中去
再次遍历m,如果存在某个元素的个数是奇数的,则len加1,并且break
代码:
class Solution {
public:
int longestPalindrome(string s) {
map<char,int> m;
for(int i=0;i<s.length();i++) //计算每个元素的个数
{
m[s[i]]++;
}
int len=0;
map<char,int>::iterator temp;
for(temp=m.begin();temp!=m.end();temp++)
{
len+=(temp->second/2)*2; //算出每个元素成对的个数,再乘以2加到len中去
}
for(temp=m.begin();temp!=m.end();temp++)
{
if(temp->second%2==1) //如果存在某个元素的个数是奇数的,则len加1,并且break
{
len+=1;
break;
}
}
return len;
}
};
效率:99.41%
法二:
和法一思路一样,只不过在遍历map时不用迭代器,而用字母
代码:
static const auto io_speed_up= [](){
std::ios::sync_with_stdio(false);
cin.tie(nullptr);
return 0;
}();
class Solution {
public:
int longestPalindrome(string s) {
map<char,int> m;
for(int i=0;i<s.length();i++)
{
m[s[i]]++;
}
int len=0;
for(char i='A';i<='z';i++)
{
len+=(m[i]/2)*2;
}
for(char i='A';i<='z';i++)
{
if(m[i]%2==1)
{
len+=1;
break;
}
}
return len;
}
};
效率:99.41%