要求:給定1個字符串,比如ababc,要求找出“第1個最長的不重復子串”,即:"abc"
思路:遍歷每個字符,尋找以它開頭的不重復子串,遍歷過程中,可以用一個Set作為緩沖區,存放曾經處理過的起始字符串。
過程:
(a)babc -> 子串為a
(ab)abc -> 子串為ab
(ab)abc -> 發現重復字符a,准備從第2個字符開始新一輪查找
a(b)abc -> 子串為b
a(ba)bc -> 子串為ba
a(ba)bc -> 發現重復字符b,准備從第3個字符開始新一輪查找
ab(a)bc -> 子串為a
ab(ab)c -> 子串為ab
ab(abc) -> 查找結束
代碼:
/**
* 查找最長不重復子串
*
* @param s
* @return
*/
public String getFirstLongestSubstring(String s) {
System.out.println(s);
char[] arr = s.toCharArray();
Set<Character> set = new HashSet<>();
int right = -1, maxLen = -1;
String subStr = "";
for (int i = 0; i < arr.length; i++) {
if (i > 0) {
//縮小左邊界
set.remove(arr[i - 1]);
}
while (right + 1 < arr.length && !set.contains(arr[right + 1])) {
set.add(arr[right + 1]);
//擴大右邊界
right++;
}
int len = right - i + 1;
if (len > maxLen) {
maxLen = len;
char[] temp = new char[maxLen];
s.getChars(i, right + 1, temp, 0);
subStr = new String(temp);
}
if (maxLen >= arr.length - i) {
break;
}
}
return subStr;
}
