題目
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。
示例 1:
輸入: 「abcabcbb」
輸出: 3
解釋: 因為無重複字元的最長子串是 「abc」,所以其長度為 3。
示例 2:
輸入: 「bbbbb」
輸出: 1
解釋: 因為無重複字元的最長子串是 「b」,所以其長度為 1。
示例 3:
輸入: 「pwwkew」
輸出: 3
解釋: 因為無重複字元的最長子串是 「wke」,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,「pwke」 是乙個子串行,不是子串。
解題:題目解釋中給出了提示,我們要尋找的時最長子串,子串的含義是這個字串每個字元在位置上必須是相鄰的。
解法一:暴力解法
用乙個string儲存當前判斷中的字串,每加入乙個新字元時,遍歷該字串中是否已存在該字元,若存在則直接把該字串返回給list,如果不存在就新增該字元。最後遍歷list,找到最長子串。但是該方法執行超時,只能拋棄。
解法二:滑動視窗
1.設定兩個標誌位start和end,初始值都為0,代表指向string第乙個字元。
2.建立乙個hash表,key儲存字元,value儲存該字元在字串中的位置+1(+1是的目的是,如果檢測的字元與該字元相同,那麼新字元想要不重複,必須除去前面重複的字元,新字串開始的位置則是該字元在字串中的位置+1,即value值)。——這部分建議自己動手畫圖好理解一點。
簡單來說,這個hash表儲存的資訊就是**(字元a,a出現重複時新字串的起始位置)**。
兩種例子:
重複字元相鄰:字串「abba」,檢測到第三個字元時出現重複,那麼新的字串應該從第三個字元開始才不會重複。
重複字元不相鄰:字串「***f」,檢測到第三個字元時出現重複,那麼新字串應該從第二個字元開始才不會重複。
3.end不斷自增,start則是出現重複字元時才會改變;最長子串長度計算為(end-start+1)。
需要注意的點:
start值改變的時候,需要比較目前start的值和目標值,因為像「abba」字串這種情況,判斷進行到「ba」時,此時start指向b,end指向a,a在hash表中有儲存,其value是1,如果直接把value值賦給start,顯然新字串不能從第乙個a開始。所以比較**start =math.max((int)hs[s[end]],start);**這條語句防止以上情況出現。(之前沒有比較導致我結果出錯,逐語句執行才發現錯誤,f11還是很有必要的)
//c#**
public class solution
else hs.add(s[end], end + 1);
ans = math.max(end - start + 1, ans);
}return ans;
}}
思路和**參考了這位大佬: leetcode 3 無重複的字串
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...
leetcode 3 無重複字元的最長字元子串
堅持打卡!題目 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwk...
leetcode 3 最長無重複字串
3.longest substring without repeating characters 題面 given a string,find the length of the longest substring without repeating characters.給定字串,找到最長無重複字...