Given a string s, find the length of the longest substring without repeating characters.
Example 1:
Input: s = “abcabcbb” Output: 3 Explanation: The answer is “abc”, with
the length of 3. Example 2:Input: s = “bbbbb” Output: 1 Explanation: The answer is “b”, with the
length of 1. Example 3:Input: s = “pwwkew” Output: 3 Explanation: The answer is “wke”, with
the length of 3. Notice that the answer must be a substring, “pwke” is
a subsequence and not a substring. Example 4:Input: s = “” Output: 0
Constraints:
0 <= s.length <= 5 * 104
s consists of English letters, digits, symbols and spaces.
- brute force (O(n^3))
(超时了,直接遍历string, 一遍一遍查找相同的,储存最大值即可,(用两个for loop遍历string,然后再判断中间substring是否符合条件,需要用到hashtable来判断)) - DP + memo + two pointer
以下是非常简陋的图解。。。。。
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length() == 0) return 0;
Map<Character, Integer> map = new HashMap<>();
int max = 0;
int start = 0;
for (int i = 0; i < s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
start = Math.max(start, map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i), i);
max = Math.max(max, i - start + 1);
}
return max;
}
}
时间复杂度O(n)