圖示:針對于字符串“tmmuat”龙优,我們需要創(chuàng)建兩個索引值都是從0開始牺荠,再創(chuàng)建一個HashMap用來存放s[endIndex]:index鍵值對
圖示:通過循環(huán)遍歷,不斷地把對應(yīng)的鍵值對放進HashMap中
圖示:當(dāng)遇到HashMap中已經(jīng)存在的字符時怎爵,就要更新startIndex為map[m]+1悯森,說明遇到了重復(fù)的字符了,那么就要讓當(dāng)前窗口的左邊界向右邊挪一格巷怜;并且更新HashMap中的字符索引葛超;但是最長子串的長度不能因為窗口的變化而變小暴氏,它需要和以往的最大窗口大小比較
圖示:繼續(xù)保持循環(huán)遍歷
圖示:最長子串結(jié)果隨著遍歷的逐漸變長
圖示:當(dāng)再次遍歷到一個重復(fù)的字符時,更新startIndex時绣张,需要比較當(dāng)前窗口左邊界比較大小答渔,左邊界肯定是不能往左邊走的,只能向右一往無前侥涵;同時需要更新最長子串結(jié)果沼撕。
最后,以上邏輯全部轉(zhuǎn)換成代碼芜飘,如下:
goland語言
func lengthOfLongestSubstring(s string) int {
// 窗口左邊界
startIndex := 0
// 存放【字符:索引值】鍵值對
hashMap := make(map[byte]int)
// 最長子串結(jié)果值
result := 0
// 循環(huán)遍歷
for endIndex := 0; endIndex < len(s); endIndex++ {
// 當(dāng)命中鍵值對中的字符時务豺,說明遇到重復(fù)字符了
if index, ok := hashMap[s[endIndex]]; ok {
// 那么就要更新窗口左邊界,左邊界不能向左移動嗦明,只能向右一往無前
startIndex = max(startIndex, index+1)
}
// 更新字符的最新索引值
hashMap[s[endIndex]] = endIndex
// 更新當(dāng)前遇到的最長子串結(jié)果值
result = max(result, endIndex-startIndex+1)
}
// 返回最終結(jié)果值
return result
}
// 求最大值
func max(v1 int, v2 int) int {
if v1 > v2 {
return v1
}
return v2
}
java語言
public static int lengthOfLongestSubstring(String s) {
// 定義窗口左邊界
int startIndex = 0;
// 存放【字符:索引值】鍵值對
Map<Character, Integer> hashMap = new HashMap<>();
// 最長子串結(jié)果值
int result = 0;
// 循環(huán)遍歷
for (int endIndex = 0; endIndex < s.length(); endIndex++) {
// 當(dāng)命中鍵值對中的字符時笼沥,說明遇到重復(fù)字符了
Integer index = hashMap.get(s.charAt(endIndex));
if (index != null) {
// 那么就要更新窗口左邊界,左邊界不能向左移動娶牌,只能向右一往無前
startIndex = Math.max(startIndex,index+1);
}
// 更新字符的最新索引值
hashMap.put(s.charAt(endIndex),endIndex);
// 更新當(dāng)前遇到的最長子串結(jié)果值
result=Math.max(result,endIndex-startIndex+1);
}
// 返回最終結(jié)果值
return result;
}
python代碼
def lengthOfLongestSubstring(self, s: str) -> int:
# 定義窗口左邊界
startIndex = 0
# 存放【字符:索引值】鍵值對
hashMap = {}
# 最長子串結(jié)果值
result = 0
# 循環(huán)遍歷
for endIndex in range(len(s)):
# 當(dāng)命中鍵值對中的字符時奔浅,說明遇到重復(fù)字符了
if s[endIndex] in hashMap.keys():
# 那么就要更新窗口左邊界,左邊界不能向左移動诗良,只能向右一往無前
startIndex = max(startIndex, hashMap[s[endIndex]] + 1)
# 更新字符的最新索引值
hashMap[s[endIndex]] = endIndex
# 更新當(dāng)前遇到的最長子串結(jié)果值
result = max(result, endIndex - startIndex + 1)
# 返回最終結(jié)果值
return result