题目
给定一个包含大写字母和小写字母的字符串 s ,返回通过这些字母构造成的最长的回文串 。题目链接
在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。
示例 :
输入:s = “abccccdd”
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
思路分析
如果知道unordered_map<char,int> num;的用法的话,这题写起来就很轻松了。
此题所用知识点介绍
unordered_map是C++的一个容器,它是一个关联容器,内部采用的是hash表结构,拥有快速检索的功能。
- unordered_map<char,int> num;//创建一个num的容器
- ++num[‘a’];//字符串a对应键值自增,放前面自增在算法题中开销会稍微小一点点。
- for(auto i : num)//遍历整个num容器,auto能对应num中的不同量
- 接3,i.first返回的是char类型,i.second返回的是对应char类型的键值。
题解
class Solution {
public:
int longestPalindrome(string s) {
int len=s.length(),ans=0;
unordered_map<char,int> num;
for(int i=0;i<len;i++)
{
++num[s[i]];
}
for(auto i:num)
{
int k=i.second;
ans+=k/2*2;
if(ans%2==0&&k%2==1)
ans++;
}
return ans;
}
};
unordered_map用法补充(参考csdn用户:zou_albert的文章)
#include<string>
#include<iostream>
#include<unordered_map>
using namespace std;
int main()
{
unordered_map<string, int> dict; // 声明unordered_map对象
// 插入数据的三种方式
dict.insert(pair<string,int>("apple",2));
dict.insert(unordered_map<string, int>::value_type("orange",3));
dict["banana"] = 6;
// 判断是否有元素
if(dict.empty())
cout<<"该字典无元素"<<endl;
else
cout<<"该字典共有"<<dict.size()<<"个元素"<<endl;
// 遍历
unordered_map<string, int>::iterator iter;
for(iter=dict.begin();iter!=dict.end();iter++)
cout<<iter->first<<ends<<iter->second<<endl;
// 查找
if(dict.count("boluo")==0)
cout<<"can't find boluo!"<<endl;
else
cout<<"find boluo!"<<endl;
if((iter=dict.find("banana"))!=dict.end())
cout<<"banana="<<iter->second<<endl;
else
cout<<"can't find boluo!"<<endl;
return 0;
}
大佬文章中还有map用法的补充,以及map和unordered_map的比较
map
优点:有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作。红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高。
缺点:空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点,孩子节点以及红/黑性质,使得每一个节点都占用大量的空间
适用处:对于那些有顺序要求的问题,用map会更高效一些。
unordered_map
优点:内部实现了哈希表,因此其查找速度是常量级别的。
缺点:哈希表的建立比较耗费时间
适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map
————————————————
版权声明:本文为CSDN博主「zou_albert」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zou_albert/article/details/106983268