最长不重复子串

2 阅读1分钟

image.png

题目地址:

leetcode.com/problems/lo…

思路

最先想到的就是使用动态规划,打表,代码如下:

    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.isEmpty()) {
           return 0;
        }
        int len = s.length();
        int[][] data = new int[len][len];
        int max = 1;
        for(int i=0;i<len;i++){
            data[i][i] = 1;
        }
        for(int i=0;i<len;i++){
            for(int j=i+1;j<len;j++){
              String charData = s.substring(j,j+1);
              boolean flag = s.substring(i,j).contains(charData);
              data[i][j] = !flag ? (data[i][j-1]+1):0;
              max = Integer.max(data[i][j],max);
            }
        }
        return max;
    }
}

但是最后,内存过多,不够使用,这个题目最优的解法是滑动窗口

    int n = s.length(), maxLen = 0;
    Set<Character> set = new HashSet<>();
    int i = 0, j = 0;
    while (j < n) {
        if (!set.contains(s.charAt(j))) {
            set.add(s.charAt(j));
            maxLen = Math.max(maxLen, j - i + 1);
            j++;
        } else {
            set.remove(s.charAt(i));
            i++;
        }
    }
    return maxLen;
}