C.滑动窗口——3090. 每个字符最多出现两次的最长子字符串(模版题)

编程达人挑战赛·第4期 10w+人浏览 240人参与

题目链接:3090. 每个字符最多出现两次的最长子字符串(简单)

算法原理:

解法:(越短越合法/求最长/最大)滑动窗口

击败100.00%

时间复杂度O(N)

本质与优选算法-滑动窗口:10.无重复字符的最长字串一样,只是把可重复元素从1变成了2

由于字符串中只有26个字母,所以可以用数组模拟哈希表来提高效率

1️⃣进窗口:遍历字符串每个元素

2️⃣出窗口:当哈希表中该元素出现次数>2时,左端点持续出窗口,直至该元素的次数==2

3️⃣更新:取最大值作为返回值

Java代码:

class Solution {
    public int maximumLengthSubstring(String ss) {
        //为了提高效率,这里用数组模拟哈希表
        char[] s=ss.toCharArray();
        int[] hash=new int[26];
        int n=s.length,left=0,ret=0;
        for(int right=0;right<n;right++){
            //进窗口
            int in=s[right]-'a';
            hash[in]++;
            //出窗口
            while(hash[in]>2){
                int out=s[left]-'a';//注意out要定义在循环里,方便更新
                hash[out]--;
                left++;
            }
            //更新
            ret=Math.max(ret,right-left+1);
        }
        return ret;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值