無重複字元的最長子串

2021-09-29 08:00:14 字數 2048 閱讀 3078

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

示例 1:

輸入: 「abcabcbb」

輸出: 3

解釋: 因為無重複字元的最長子串是 「abc」,所以其長度為 3。

示例 2:

輸入: 「bbbbb」

輸出: 1

解釋: 因為無重複字元的最長子串是 「b」,所以其長度為 1。

示例 3:

輸入: 「pwwkew」

輸出: 3

解釋: 因為無重複字元的最長子串是 「wke」,所以其長度為 3。

請注意,你的答案必須是 子串 的長度,「pwke」 是乙個子串行,不是子串。

因為此處涉及到子串(一般子串/子集的問題可以使用dp來解)所以dp是一種選擇,關鍵在於找出狀態轉移方程,並且規定初始值;另外雙指標+hashmap/hashset也是一種選擇,兩個指標分別記錄當前無重複子串的開始和遍歷到的位置,hash用來輔助工作。

雙指標+hashmap

描述:

定義unordered_mapm來儲存出現過的字元和位置,兩項分別對應字元和此字元在遍歷到s[i]情況下最後出現的位置

定義區間[left,i],表示當前無重複字元的子串;並定義相應的res來記錄最大長度(此處left是子串左邊界的前乙個字元位置)

i. 如果當前字元不在m中,則直接將此字元放入雜湊表中,並且取res和i-left的較大值(i-left即是當前子串的長度)

ii. 如果當前字元在m中,假如為m[s[i]]

1)m[s[i]]>left,即之前出現的元素在子串當中,要將left進行更新

2)否則,不在當前子串中,同i

**:

class solution 

m[s[i]] = i;

res = max(res, i - left);

}return res;

}};

雙指標+hashset

描述:

hashset和上一種解法中的hashmap作用不同

hashmap:用來記錄每個元素最後出現的位置,hashmap的大小不會減少

hashset:用來記錄當前無重複子串中不同字元的個數,所以有插入和刪除的情況,當有重複元素時,從set的起始位置開始刪除,每次刪除乙個元素,如果還有重複的接著刪,直到無重複;在插入之後需要更新res,記錄的最大長度。

**:

class solution   else 

}return res;

}};

動態規劃

描述:

維護乙個陣列dp,dp[i]表示到以第i個字元結尾(第i個字串屬於子字串)的不包含重複陣列的子字串的最大長度。(因為最終只是求其長度,所以我們並不儲存最大不重複子字串,只是儲存其長度方便後續比較)

狀態轉移方程:

i. 如果第i個字元從未出現過,那麼dp[i] = dp[i-1] + 1;

ii. 如果第i個字元出現過, 此時需要分情況討論。

這時我們找出第i個字元最近一次出現的位置index,記兩個的距離為d= i-index:

1) d<=dp[i-1],即這個字元出現在以第i-1個字元結尾的不包含重複陣列的子字串中,則dp[i] = d;

2) d>dp[i-1], 即這個字元沒有出現在以第i-1個字元結尾的不包含重複陣列的子字串中,則dp[i] = dp[i-1] + 1 。

此外,需要定義mapm來記錄出現過的字元,用於判斷當前的字元是否出現過。

最終,遍歷陣列dp,找出最大值即可。

**:

class solution

int res=0;

for(int i=0;i[參考文件]

link

link

無重複字元最長子串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...

無重複字元最長子串

題目描述 給定乙個字串,找出不含有重複字元的 最長子串 的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是子串行而不是子串 i...

無重複字元的最長子串

給定乙個字串,找出不含有重複字元的最長子串的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是 子串行 而不是子串。int le...