力扣 找出出现至少三次的最长特殊子字符串II

给你一个仅由小写英文字母组成的字符串 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;  
    }
};

  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值