題目
給定一個字元串,請你找出其中不含有重複字元的 最長子串 的長度。
解題思路
一步步拆解、補充,直到完整解題
1.首先想到的是需要循環整個字元串
class Solution {
int lengthOfLongestSubstring(String s) {
// 循環整個字元串
int len = s.length();
for (int i = 0; i < len; i++) {
}
return 0;
}
}
2.整個解題的過程大緻是:
1)從最左邊的字元開始與右邊的字元一一比對,發現有重複的字元之後,計算目前子字元串的長度;
2)移動最左邊的字元,重複1)過程,直到字元串的最右邊結束,即循環整個字元串。
技巧:
a)在判斷字元串重複字元的技巧,使用Set
b)移動過程中右指針始終向右移動,不需要循環,如同一個移動的視窗。
c)字元串循環開始時,需要從Set中移除上一個字元串中的字元
步驟:
1)初始化右指針、無重複子字元串長度、Set容器
2)當右指針未到字元串最後邊,并且右指針所指字元不包含在子字元串時,繼續循環操作
3) 計算目前子字元串的長度是否大于上次計算的字元串長度
4)從Set中移除上一個字元串中的字元
代碼
class Solution {
int lengthOfLongestSubstring(String s) {
// 1)初始化右指針
int rk = 0;
// 1)初始化無重複子字元串長度
int subLen = 0;
// 1)初始化Set容器
Set<Character> subSet = new HashSet<>();
// 循環整個字元串
int len = s.length();
for (int i = 0; i < len; i++) {
// 4)從Set中移除上一個字元串中的字元
if (i != 0) {
subSet.remove(s.charAt(i - 1));
}
// 2)當右指針未到字元串最後邊,并且右指針所指字元不包含在子字元串時,繼續循環操作
while (rk < len && !subSet.contains(s.charAt(rk))) {
// 将右指針所指字元放入字元Set中
subSet.add(s.charAt(rk));
// 右指針向右移動
rk = rk + 1;
}
// 3) 計算目前子字元串的長度是否大于上次計算的字元串長度
subLen = Math.max(subLen, rk - i);
}
return subLen;
}
}