首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >天池 在线编程 有效的字符串

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

作者头像
Michael阿明
发布2021-02-19 12:46:41
发布2021-02-19 12:46:41
36500
代码可运行
举报
运行总次数:0
代码可运行

1. 题目

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

代码语言:javascript
代码运行次数:0
运行
复制
1 ≤ |s| ≤ 100000 Each character s[i] ∈{‘a' - ’z'}

示例

代码语言:javascript
代码运行次数:0
运行
复制
示例输入1:aabbcd
示例输出1:NO
解释1:
我们需要删除两个字符,'c'和'd' —> 'aabb' 或者 'a'和'b'  —> 'abcd',使其有效。
而我们只能删除一个字符,所以它是 "NO"。

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

2. 解题

代码语言:javascript
代码运行次数:0
运行
复制
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++

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/11/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档