一、题目
1、题目描述
给你一个仅由小写英文字母组成的字符串
s
。如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串
"abc"
不是特殊字符串,而字符串"ddd"
、"zz"
和"f"
是特殊字符串。返回在
s
中出现 至少三次 的 最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回-1
。子字符串 是字符串中的一个连续 非空 字符序列。
2、接口描述
python3
class Solution:
def maximumLength(self, s: str) -> int:
cpp
class Solution {
public:
int maximumLength(string s) {
}
};
js
/**
* @param {string} s
* @return {number}
*/
var maximumLength = function(s) {
};
3、原题链接
二、解题报告
1、思路分析
考虑记录每个字母的连续子串的长度列表
然后遍历每个列表a
先将列表a降序排序
如果a[0] > 2,那么可以从a[0]中拆出来3个a[0] - 2
如果a[0] == a[1],那么可以从二者中拆出来三个a[0] -1
如果a[0] > a[1],那么可以从二者中拆出来三个a[1] - 1
当然可以从a[0], a[1], a[2]中拆出三个a[2]
答案就是
max( {ans, a[0] - 2, min(a[0] - 1, a[1]), a[2] } );
2、复杂度
时间复杂度: O(nlogn)空间复杂度:O(nU)
3、代码详解
python3
class Solution:
def maximumLength(self, s: str) -> int:
cnt = defaultdict(list)
cur = 0
for i, x in enumerate(s):
cur += 1
if i + 1 == len(s) or s[i + 1] != x:
cnt[x].append(cur)
cur = 0
ans = 0
for a in cnt.values():
a.sort(reverse=True)
a.extend([0, 0])
ans = max(ans, a[0] - 2, min(a[0] - 1, a[1]), a[2])
return ans if ans else -1
cpp
class Solution {
public:
int maximumLength(string s) {
int n = s.size();
vector<vector<int>> cnt(26, vector<int>());
int cur = 0;
for (int i = 0; i < n; i ++ ) {
cur ++;
if (i + 1 == n || s[i] != s[i + 1]) {
cnt[s[i] - 'a'].push_back(cur);
cur = 0;
}
}
int ans = 0;
for (auto& a : cnt) {
if (a.size() == 0)
continue;
sort(a.begin(), a.end(), [](int x, int y){
return x > y;
});
a.push_back(0), a.push_back(0);
ans = max( {ans, a[0] - 2, min(a[0] - 1, a[1]), a[2] } );
}
return ans ? ans : -1;
}
};
js
/**
* @param {string} s
* @return {number}
*/
var maximumLength = function(s) {
const n = s.length;
const cnt = Array.from( { length: 26 }, () => []);
let cur = 0;
for (let i = 0; i < n; i ++ ) {
cur ++;
if (i + 1 == n || s[i] != s[i + 1]) {
cnt[s[i].charCodeAt(0) - 'a'.charCodeAt(0)].push(cur);
cur = 0;
}
}
let ans = 0;
for (let a of cnt) {
if (a.length == 0)
continue;
a.sort((x, y) => y - x);
a.push(0), a.push(0);
ans = Math.max(ans, a[0] - 2, Math.min(a[0] - 1, a[1]), a[2]);
}
return ans ? ans : -1;
};