这道题使用双指针(滑动窗口)+哈希表可破。
public int lengthOfLongestSubstring(String s) {
if (s==null||s.equals(""))
return 0;
int start = 0;
int end = 0;
char[] arr = s.toCharArray();
int[] hash = new int[128]; //构建一个字母哈希表
hash[arr[0]-1] = 1;
int max = 1;
for (int i = 1; i < s.length() ; i++) {
if (hash[arr[i]-1]==0){ //如果start~end中还没出现当前arr[i] 那么就把它添加到哈希表中
hash[arr[i]-1] = 1; //置为1 表示出现过
end = i; //更新end结点
if (end-start+1>max) //如果start~end长度大于max 更新max
max++;
}else { //如果当前arr[i]在前面已经出现过 那我们要更新start结点
while (arr[start]!=arr[i]){ //找到之前出现过arr[i]的位置i
hash[arr[start]-1] = 0;
start++;
}
start++; //把start置为i的下一个
}
}
return max;
}
官方题解的解法
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
int[] index = new int[128]; // current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
i = Math.max(index[s.charAt(j)], i);
ans = Math.max(ans, j - i + 1);
index[s.charAt(j)] = j + 1;
}
return ans;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-by-leetcod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
好吧就是比我简洁多了 。不过我觉得我按着我这个逻辑走 ,更清晰 ,更能一步就懂。二者效率差不多。