问题描述
给你一个仅由小写英文字母组成的字符串
s
。如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串
"abc"
不是特殊字符串,而字符串"ddd"
、"zz"
和"f"
是特殊字符串。返回在
s
中出现 至少三次 的 最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回-1
。子字符串 是字符串中的一个连续 非空 字符序列。
示例
示例 1:
输入:s = "aaaa" 输出:2 解释:出现三次的最长特殊子字符串是 "aa" :子字符串 "aaaa"、"aaaa" 和 "aaaa"。 可以证明最大长度是 2 。示例 2:
输入:s = "abcdef" 输出:-1 解释:不存在出现至少三次的特殊子字符串。因此返回 -1 。示例 3:
输入:s = "abcaba" 输出:1 解释:出现三次的最长特殊子字符串是 "a" :子字符串 "abcaba"、"abcaba" 和 "abcaba"。 可以证明最大长度是 1 。提示:
3 <= s.length <= 50
s
仅由小写英文字母组成。
问题分析:
我的方法比较简单暴力,首先如何判断一个字符串是特殊子字符串,我们需要单独写一个函数来判断。然后使用map,遍历所有的子串,因为长度只有3-50,所以大概率n^2也能过,把子串中的特殊子字符串及其出现的次数都存里面。然后遍历map,在其中出现3次以上的子字符串中寻找最大长度即可。
代码如下:
class Solution {
public:
// 判断是不是特殊字符串
bool judge(string s) {
for (int k = 1; k < s.size(); k++) {
if (s[k] != s[k - 1])
return false;
}
return true;
}
int maximumLength(string s) {
unordered_map<string, int> mp;
int maxL = -1;
// 遍历子字符串
for (int i = 0; i < s.size(); i++) {
for (int j = i; j < s.size(); j++) {
string q = s.substr(i, j - i + 1);
// 如果是特殊的
if(judge(q))
mp[q]++;
}
}
for (auto& v : mp) {
// 出现次数>=3
if (v.second >= 3)
// 更新最大长度
maxL = max(maxL, (int)v.first.size());
}
return maxL;
}
};