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.
题意:题意很简单,就是给定一个字符串,从中找到最长的不包含重复字符的子串,并返回其长度。
思路:利用kmp的思想加以优化,不断向右扫描并记录该字符所在的位置。遇到重复,则将扫描位置移动到该字符所记录位置的右侧,继续扫描。可以用数组或map实现。
代码如下:
public int lengthOfLongestSubstring(String s) {
int max = 0, now = 0,i , j;
int pos[] = new int[128];
Arrays.fill(pos, -1);
for (i = 0;i < s.length();i++){
now = 1;
pos[s.charAt(i)] = i;
for (j = i + 1;j < s.length();j++){
if (pos[s.charAt(j)] > -1){
break;
}
pos[s.charAt(j)] = j;
now++;
}
if (now > max){
max = now;
}
if (j < s.length()){
i = pos[s.charAt(j)];
}
Arrays.fill(pos, -1);
}
return max;
}
public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max=0;
for (int i=0, j=0; i<s.length(); ++i){
if (map.containsKey(s.charAt(i))){
j = Math.max(j,map.get(s.charAt(i))+1);
}
map.put(s.charAt(i),i);
max = Math.max(max,i-j+1);
}
return max;
}