LeetCode 3. Longest Substring Without Repeating Characters
Description
Given a string, find the length of the longest substring without repeating characters.
Example
Code
- java
class Solution {
public int lengthOfLongestSubstring(String s) {
int len = s.length();
if(s == null || len == 0) return 0;
int n = 257;
int[] hash = new int[n];
for(int i = 0; i < n; i++) {
hash[i] = -1;
}
int[] pre = new int[len];
for(int i = 0; i < len; i++) {
char ch = s.charAt(i);
pre[i] = hash[ch];
hash[ch] = i;
}
int result = 0, cnt = 0;
for(int i = 0; i < len; i++) {
if(pre[i] == -1) {
cnt++;
} else {
if(i - pre[i] > cnt) {
cnt++;
} else {
cnt = i - pre[i];
}
}
result = Math.max(result, cnt);
}
return result;
}
}
- Official Solution
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>(); // current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
if (map.containsKey(s.charAt(j))) {
i = Math.max(map.get(s.charAt(j)), i);
}
ans = Math.max(ans, j - i + 1);
map.put(s.charAt(j), j + 1);
}
return ans;
}
}
Conclusion
- 自己构建好测试样例,比如:
- “abcabcbb”
- “bbbbb”
- “pwwkew”
- “abba”
- “tmmzuxt”
- 需要保存最新的不含重复字符的起始位置