Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
一开始的想法是通过利用HashMap来判断当前字符是否存在于子字符串中。同时为了让算法更加快速,每次找到重复字符时,直接以这个字符作为新的起始点来进行查找判断。
class Solution {
public int lengthOfLongestSubstring(String s) {
int result = 0;
Map<Character,Integer> map = new HashMap<>();
int i = 0;
for (int j = 0; j < s.length(); j++){
if(map.containsKey(s.charAt(j))){
i = Math.max(map.get(s.charAt(j)),i);
}
result = Math.max(result, j-i+1);
map.put(s.charAt(j), j + 1);
}
return result;
}
}
后面在官网找到了更优的解法,利用数组直接代替HashMap。
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;
}
}