1. 程式人生 > 其它 >leetcode 3 無重複字元的最長子串

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

## 無重複字元的最長字串

給定一個字串 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;
    }
};