给你一个仅由小写英文字母组成的字符串 s
。
如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串 "abc"
不是特殊字符串,而字符串 "ddd"
、"zz"
和 "f"
是特殊字符串。
返回在 s
中出现 至少三次 的 最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回 -1
。
子字符串 是字符串中的一个连续 非空 字符序列。
解法:双指针。 定义左指针j,右指针i, (j到i-1)是一段字符连续相等的字符串,根据字符串长度我们可以计算出每种字符串 如“aaaa”中 “a”,"aa","aaa","aaaa"出现的次数,记录一个出现次数大于3且长度最大的即可。时间复杂度大概在O(n)~O(nlogn)区间,难在内存消耗比较大,需要26*O(S.size())
class Solution {
public:
int maximumLength(string s) {
int hash[26][s.size()+1];
memset(hash,0,sizeof hash);
int maxsum=0;
int i =0, j=0;
while(true)
{
if(i>=s.size())break;
while(i<s.size()&&s[j]==s[i])i++;
int len = i-j;
int k=1;
while(len)
{
hash[s[j]-'a'][len]+=k;
if(hash[s[j]-'a'][len]>=3)maxsum=max(maxsum,len);
len--;
k++;
}
j=i;
}
return maxsum?maxsum:-1;
}
};