leetcode 3 無重複字元的最長子串
阿新 • • 發佈:2021-09-22
## 無重複字元的最長字串
給定一個字串 s ,請你找出其中不含有重複字元的 最長子串 的長度。
示例 1:
輸入: s = "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: s = "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: s = "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
示例 4:
輸入: s =
輸出: 0
來源:力扣(LeetCode)
連結: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
暴力法
思路:從每一個字元開始往後走,用set存入沒重複的字元,遇到重複的停下,記錄長度,再從下一個字元開始往後走
class Solution { public: int lengthOfLongestSubstring(string s) { int i,j; int ret = 0; set<char> set; int len = s.length(); for(i=0;i<len;i++){ int temp=0; set.clear(); for(j=i;j<len;j++){ if(!set.count(s[j])){ temp++; set.insert(s[j]); } else{ break; } } ret = ret > temp ? ret : temp; } return ret; } };
滑動視窗
許多涉及子串的問題,都可以使用滑動視窗解決
思路:用兩個指標表示視窗的左端和右端,不斷將右指標和左指標右移,右指標遇到重複的就先停下,等左指標移過來,收縮視窗
class Solution { public: int lengthOfLongestSubstring(string s) { int i; int ret = 0; int p = 0; set<char> set; int len = s.length(); //i充當左指標 for(i =0 ;i<len;i++){ if(i!=0){ set.erase(s[i-1]); } //右指標不斷右移 while(p<len&&!set.count(s[p])){ set.insert(s[p]); p++; } ret = ret > p-i ? ret : p-i; } return ret; } };