无重复的最长子串长度

开始的时候没有想出解法,后开看到了双指针滑动窗口的解法,其实这种处理方法很常见,将暴力求解的过程在一次循环中完成了,时间复杂度n。

class Solution
{
    public int lengthOfLongestSubstring(String s)
    {
        //简单的双指针滑动窗口
        int[] last=new int[128];//字符最后一次出现的位置
        for(int i=0;i<128;++i)last[i]=-1;//默认字符没有出现是-1,同时也为了防止改变start=0
        int start=0,n=s.length(),ans=0;//初始化
        for(int i=0;i<n;++i)//i进行滑动,带动start
        {
            int index=s.charAt(i);//强制转换成ASCII
            start=Math.max(start,last[index]+1);
            ans=Math.max(ans,i-start+1);
            last[index]=i;
        }
        return ans;
    }
}

![image](https://uploadfiles.nowcoder.com/images/20200503/4319876_1588479435098_DD2895C6C43383B8FB80EB99DFA6EBA6 "图片标题")

这里需要注意一点,我开始差点没反应过来,start的更新一定要是start=Math.max(start,last[index]+1),而不能是start=last[index]+1。

因为,start=last[index]+1,如果出现一个新字符的时候,start就会=0了,所以要用max限制它的左移动,这也正是滑动窗口的来源,从左到右一直滑动,找到最大的ans。

import java.util.*;

public class Solution
{
    public static void main(String args[])
    {
        System.out.println(lengthOfLongestSubstring("pwwkew"));
    }
    public static int lengthOfLongestSubstring(String s)
    {
        //简单的双指针滑动窗口
        int[] last=new int[128];//字符最后一次出现的位置
        for(int i=0;i<128;++i)last[i]=-1;//默认字符没有出现是-1,同时也为了防止改变start=0
        int start=0,n=s.length(),ans=0;//初始化
        for(int i=0;i<n;++i)//i进行滑动,带动start
        {
            int index=s.charAt(i);//强制转换成ASCII
            //start=Math.max(start,last[index]+1);
            start=last[index]+1;
            ans=Math.max(ans,i-start+1);
            last[index]=i;
            System.out.println((char)index+" "+start+" "+i);
        }
        return ans;
    }
}

![image](https://uploadfiles.nowcoder.com/images/20200503/4319876_1588479642878_0DB626C7170E56B69330522554022798 "图片标题")

碰到有点蒙的情况,当然是做debug了