【小白爬Leetcode409】C++ 11中遍历容器的便捷方法
在写Leetcode 409 最长回文数 Longest Palindrome的时候,发现C++ 11中遍历容器已经非常方便了。
这道题的思路就是,用一个unordered_map(哈希表)记录每个字符出现的次数,如果出现了偶数次,直接计入答案中,如果遇到奇数次,减一计入答案中,最后再随便从出现了奇数次的元素中选一个形成回文字符串的中心,也就是是答案++,代码如下:
class Solution {
public:
int longestPalindrome(string s) {
int max_length = 0;
std::unordered_map<char,int> map;
bool flag = false; //是否有出现了奇数次的字符
for(int i=0;i<s.size();i++){ //构建哈希表
if(map.find(s[i])!=map.end()){
map[s[i]] ++;
}else map[s[i]] = 1;
}
for(auto it = map.begin();it!=map.end();it++){ //计数
if(it->second%2 == 0){
max_length += it->second;
}
else {
max_length += it->second-1;
flag = true;
}
}
if(flag) max_length++;
return max_length;
}
};
标准答案这么写:
class Solution {
public:
int longestPalindrome(string s) {
unordered_map<char, int> count;
int ans = 0;
for (char c : s)
++count[c];
for (auto p : count) {
int v = p.second;
ans += v / 2 * 2;
if (v % 2 == 1 and ans % 2 == 0)
++ans;
}
return ans;
}
};
首先它在构建哈希表的时候没有判断count[c]
是否已经存在,而是直接count[c]++
,我觉得有隐患,因为这是构建在栈上的unordered_map
,初始化的值可能是栈上存留的值,所以这个存在隐患。
然后它在遍历字符串容器的时候都用了for(类型 名称: 容器)
的语法,这是C++11 新增的特性,很类似于python里的for_ in xxx
,区别在于C++要指定类型。可以看到,当类型十分冗长(比如遍历unordered_map的时候要写成std::unordered_map<char,int>::iterator
,可以直接用auto
让编译器自动判定类型),可以写成for(auto p:count)
。