leetcode 3無重複字元的最長子串(C )

2021-09-27 18:11:42 字數 1507 閱讀 1585

題目

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。

示例 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.給定字串,找到最長無重複字...