题目考察的知识点:字符串的遍历

题目解答方法的文字分析:将字符串入到unordered_map中,统计字母出现的次数,次数为1次可以删除,并且只能删除一次。

本题解析所用的编程语言:c++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param password string字符串 
     * @param k int整型 
     * @return bool布尔型
     */
    bool isValidPalindrome(string password, int k)
    {
        // write code here
        unordered_map<char, int> umap;
        for (int i = 0; i < password.size(); ++i)
        {
            auto it = umap.find(password[i]);
            if (it != umap.end())
            {
                it->second++;
            }
            else
            {
                umap.insert(pair(password[i], 1));
            }
        }
        if (umap.size() > k)
            return false;
        
        int i = 0, j = password.size() - 1;
        int n = 1; //只能删一次
        while (i < j)
        {
            if (password[i] == password[j])
            {
                ++i;
                --j;
            }
            else if (n)
            {
                auto it1 = umap.find(password[i]);
                auto it2 = umap.find(password[j]);
                if (it1->second == 1)
                    ++i;
                else if (it2->second == 1)
                    --j;
                --n;
            }
            else 
                return false;
        }

        return true;
    }
};