给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

太菜了 这道题想不出来想用set做 最后一直有不符合情况的例子 后来找了个评论区答案提交了一下查看了第一名的代码 真的很强

public int lengthOfLongestSubstring(String s) {
        int ans = 0;
        int[] vis = new int[256];
        int len = s.length();//字符串长度
        int left = -1;
        Arrays.fill(vis,-1);//将vis每个值设置为-1
        for(int i = 0; i < len; i++) {
            int m = s.charAt(i);
            if(vis[m] > left) {//这里取的是字符串的ascll码 如果该码对应的位置有已经被赋值了
                left = vis[s.charAt(i)]; //将同位置有值的ascall码给left
            }//当读到该位置发现不是-1说明之前有存在 这时 value是其之前在字符串上的第几位 这时left被赋值为之前的第几位
            ans = Math.max(ans,i - left);//然后用i(现在的位数)减去left(之前该字符的位数)就是他们之间的位数了
            vis[s.charAt(i)] = i;//每次将该位置是第几个字符存入该位置
        }

        return ans;
    }

 该方法是定义一个数组作为标记,如果没有相同的字符则i-left相当于加1 如果有相同的情况下  i和left刚好是两个重复字符在字符串中的位置,i-left就是两个字符中间不重复字符的长度。

不管重复不重复。遍历一个字符时都会将该字符在字符串中的位置赋值给vis中该字符ascall码对应的数字的位置上,这时如果有相同的便会发现该位置有值了,则这时就会计算他们的间隔长度。如果大于之前的就会替换记录最大值的字符

使用数组标记其字符串位置用法,之前没有接触过。一定记住该方法。