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.
想了很久没想出来,借鉴了一点题解:
本题类似于最长公共子序列的问题,动规的思想
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character,Integer> map = new HashMap<>();
for(int i = 0 ,j = 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;
}
}
另一个解:
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;
}
}
int [26]
用于字母 ‘a’ - ‘z’或 ‘A’ - ‘Z’int [128]
用于ASCII码int [256]
用于扩展ASCII码
时间复杂度为:O(n)
空间复杂度为:O(n)