轉載請標明出處http://www.cnblogs.com/haozhengfei/p/d0906ebc98f7b6eaecb3ecd738dc78ac.html
最長無重復字符子串練習題









最長無重復字符子串練習
第12節 最長無重復字符子串練習題
對於一個字符串,請設計一個高效算法,找到字符串的最長無重復字符的子串長度。
給定一個字符串A及它的長度n,請返回它的最長無重復字符子串長度。保證A中字符全部為小寫英文字符,且長度小於等於500。
測試樣例:
"aabcb",5
返回:3
1
import java.util.*;
2
3
public class DistinctSubstring {
4
public int longestSubstring(String A, int n) {
5
//charPosition統計A中每種字符之前出現的位置
6
Map<Character, Integer> charPosition = new HashMap<Character, Integer>();
7
//preArr代表以s[i-1]結尾的情況下,最長無重復子串的長度
8
int[] preArr = new int[A.length()];
9
10
char[] str2charArr = A.toCharArray();
11
//從頭到尾遍歷str2charArr,統計出以每個字符為當前位置的向前最長無重復子串的長度
12
for(int i=0; i<A.length(); i++){
13
Integer lastPosOfChar = charPosition.get(str2charArr[i]);
14
if(lastPosOfChar == null){//說明當前字符第一次出現
15
//更新最長無重復子串的長度
16
preArr[i] = i == 0 ? 1 : preArr[i-1] + 1;
17
//記錄當前字符出現的位置
18
charPosition.put(str2charArr[i], i);
19
}
20
else{//當前字符不是第一次出現(既然不是第一次出現,那也不是在第一個位置),也就是之前出現過該字符
21
//獲取前一個字符最長無重復子串的長度
22
int aPos = lastPosOfChar + 1;
23
int unRepeatLen = preArr[i-1];
24
int bPos = i - unRepeatLen;
25
if(aPos >= bPos){
26
//當前位置的最長無重復子串長度
27
preArr[i] = i - aPos + 1;
28
}
29
else{
30
//當前位置的最長無重復子串長度
31
preArr[i] = i - bPos + 1;
32
}
33
//跟新當前字符出現的位置
34
charPosition.put(str2charArr[i], i);
35
}
36
}
37
//遍歷preArr,最大值即為所求
38
int max = preArr[0];
39
for(int i: preArr) if(i > max) max = i;
40
41
return max;
42
}
43
}
您的代碼已保存
答案正確:恭喜!您提交的程序通過了所有的測試用例
答案正確:恭喜!您提交的程序通過了所有的測試用例