409. 最长回文串
给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。
class Solution {
public:
int longestPalindrome(string s) {
if(s.size()==1){
return 1;
}
unordered_map<char,int> countmap;
int length=s.size();
for(int i=0;i<length;i++){
countmap[s[i]]++;
}
bool first=false;
int sum=0;
int max=0;
for(const auto& kvp:countmap){
if(kvp.second%2==0){
sum+=kvp.second;
}else{
first=true;
sum+=(kvp.second-1);
}
}
if(first){
sum++;
}
return sum;
}
};
迭代器的使用
迭代器是一种在C++中用于遍历容器(如数组、向量、列表、哈希表等)中元素的工具。迭代器提供了一种通用的方法,使得无论容器的内部结构如何,我们都可以通过迭代器来访问容器中的元素,而不需要关心底层实现细节。
迭代器提供了类似指针的功能,可以让您在容器中前进、后退,访问元素值,并在容器中插入或删除元素。不同类型的容器(如数组、向量、列表、哈希表)可能有不同类型的迭代器。
以下是一些常见的迭代器操作:
- begin() 和 end():
begin()
返回指向容器中第一个元素的迭代器,end()
返回指向容器尾部的迭代器。通常,end()
指向的位置并不是最后一个元素,而是最后一个元素之后的位置。迭代器在遍历时,会从begin()
开始,一直遍历到end()
之前的位置。
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
- 使用迭代器访问元素:可以通过解引用迭代器来访问容器中的元素。
std::vector<int> vec = {1, 2, 3};
auto it = vec.begin();
std::cout << *it; // 输出 1
- 迭代器移动:迭代器可以使用递增操作符
++
来向前移动,也可以使用递减操作符--
来向后移动。
std::vector<int> vec = {1, 2, 3};
auto it = vec.begin();
++it; // 移动到下一个元素,现在 it 指向 2
- 插入和删除元素:使用迭代器可以在容器中插入或删除元素。
std::vector<int> vec = {1, 2, 3};
auto it = vec.begin();
vec.insert(it + 1, 4); // 在第二个位置插入 4,变为 {1, 4, 2, 3}
vec.erase(it); // 删除第一个元素,变为 {4, 2, 3}
迭代器提供了一种灵活的方式来操作容器中的元素,使得我们能够以通用的方式遍历、访问和修改容器的内容,而不需要依赖特定容器的实现细节。然而,请注意,在遍历过程中对容器进行插入或删除操作可能会影响迭代器的有效性,需要谨慎处理。
使用迭代器遍历哈希表
class Solution {
public:
int longestPalindrome(string s) {
if(s.size()==1){
return 1;
}
unordered_map<char,int> countmap;
int length=s.size();
for(int i=0;i<length;i++){
countmap[s[i]]++;
}
bool first=false;
int sum=0;
int max=0;
for(auto it=countmap.begin();it!=countmap.end();it++){
if(it->second%2==0){
sum+=it->second;
}else{
first=true;
sum+=(it->second-1);
}
}
if(first){
sum++;
}
return sum;
}
};