【滑动窗口】无重复字符的最长子串-java 详解+代码

无重复字符的最长子串

给定一个字符串s,找出其中不含有重复字符的最长子串的长度。
时间复杂度为O(n)

输入:s="abcabcbb"
输出:3
无重复字符的最长子串是“abc”,长度为3

第一步:right指针从0位置开始依次遍历,从0位置开始,把hash表里没有的元素依次丢到hash表里,直到right遍历到和之前有重复的元素为止,right停止。记录当前的长度
在这里插入图片描述
第二步:此时left指针向右移动,移动到先前重复元素的下一个位置,与此同时,hash表需要剔除重复元素及排在他之前的元素。此时right指针开始向右移动(重复操作一),直到right遍历到数组的最后,得到的新的长度与原来旧的长度比较,留下更长的那一个。
在这里插入图片描述

public class Test10 {
public int lengthOfLongestSubstring(String ss){
    char[] s=ss.toCharArray();
    int[] hash=new int[128];//用数组代表hash表
    int left=0,right=0,n=ss.length();
    int ret=0;
    while(right<n){
        hash[s[right]]++;//进入窗口
        while(hash[s[right]]>1){//判断出现重复元素,哈希值大于1
            hash[s[left++]]--;}//让left所对应的字符移出hash表,并让left+1. 滑出窗口
            ret=Math.max(ret,right-left+1);//更新结果
            right++;//让下一个字符进入窗口
        }
    return ret;
}

    public static void main(String[] args) {

    Test10 solution=new Test10();
        String ss="1263894";
        System.out.println(solution.lengthOfLongestSubstring( ss));

    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值