3. 无重复字符的最长子串

95 阅读1分钟

无重复字符的最长子串

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

class Solution {
    public static int lengthOfLongestSubstring(String s) {
        if (s.equals("")) {
            return 0;
        }else{
            char[] arr = s.toCharArray();

            int[] ints = new int[arr.length];

            for (int i = 0; i < arr.length; i++) {
                String ss = "";
                int count = 0;
                for (int j = i; j < arr.length; j++) {
                    if (ss.indexOf(arr[j]) == -1) {
                        ss +=arr[j];
                        count++;
                    }else{
                        ints[i] = count;
                        break;
                    }
                    if (j==arr.length - 1) {
                        ints[i] = count;
                    }
                }
            }
            int max = ints[0];
            for (int i = 0; i < ints.length; i++) {
                if (ints[i] > max) {
                    max = ints[i];
                }
            }
            return max;
        }
      
    }
}

看完自己的题解之后,我觉得还有很长的路要走,不用想我的答案非常繁琐方法还很蠢,但是这也难为我了,我也好不容易搞出来了,真的写半天的。

看完题解之后,才知道这是一个滑动窗口的问题。后面还有很多的类似问题。不过,这个是一个典型的案例,估计弄懂以后,很多的类似问题可以轻松解决。

题解

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s.length()==0) return 0;
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        int max = 0;
        int left = 0;
        for(int i = 0; i < s.length(); i ++){
            if(map.containsKey(s.charAt(i))){
                left = Math.max(left,map.get(s.charAt(i)) + 1);
            }
            map.put(s.charAt(i),i);
            max = Math.max(max,i-left+1);
        }
        return max;
        
    }
}

我读了一遍解题者的思路就是还没吃透,然后看了B站的视频无重复字符的最长子串--树森学院 的视频后懂了。