文章目录
- 1. 题目
- 2. 解题
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 hereunordered_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个出现一次的(个数多的那个),且 两者长度相差1return "YES";return "NO";}
};
50ms C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!