题目地址:
思路
最先想到的就是使用动态规划,打表,代码如下:
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;
}