【小白爬Leetcode409】C++ 11中遍历容器的便捷方法

【小白爬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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值