天池 在线编程 有效的字符串

文章目录

1. 题目

描述
如果字符串的所有字符出现的次数相同,则认为该字符串是有效的。
如果我们可以在字符串的某1个索引处删除1个字符,并且其余字符出现的次数相同,那么它也是有效的。
给定一个字符串s,判断它是否有效。如果是,返回YES,否则返回NO。

1|s|100000 Each character s[i]{‘a' - ’z'}

示例

示例输入1:aabbcd
示例输出1:NO
解释1:
我们需要删除两个字符,'c''d'> 'aabb' 或者 'a''b'> 'abcd',使其有效。
而我们只能删除一个字符,所以它是 "NO"。

示例输入2:aabbccc
示例输出2:YES
解释2:
除 'c' 出现三次外,其他所有字符都出现两次。
我们可以删除一个 'c' 来获得一个有效的字符串,所以它是 "YES"

来源:https://tianchi.aliyun.com/oj/141758389886413149/160295184768372894

2. 解题

class Solution {
public:
    /**
     * @param s: a String
     * @return: if valid return "YES" else return "NO"
     */
    string isValid(string &s) {
        // write your code here
        unordered_map<char, int> m;
        for(char c : s)
            m[c]++;
        map<int, int> count;
        for(auto &mi : m)
            count[mi.second]++;
        if(count.size() > 2)
            return "NO";
        if(count.size() == 1)
            return "YES";
        // 有两种数量
        int a = count.begin()->first, b = count.rbegin()->first;
        int n1 = count.begin()->second;
        int n2 = count.rbegin()->second;
        if(n1 == 1 && a==1)//删除唯一1个出现一次的(个数少的那个)"aabbc"
            return "YES";
        if(b-a==1 && n2 ==1)//删除唯一1个出现一次的(个数多的那个),且 两者长度相差1
            return "YES";
        return "NO";
    }
};

50ms C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页