leetcode3 無重複字元的最長子串

2022-08-31 03:54:06 字數 1378 閱讀 1234

解法1:暴力法

解題步驟:

①找出字串中的所有子串:兩層迴圈實現

②判斷子串中是否有重複字元:set實現

遍歷子串,如果set中有該字元,則返回false,否則返回true

#include#include

#include

using

namespace

std;

class

solution}}

return

count;

}bool allunique(string s, int start, int

end)

set.insert(s[i]);

}return

true

; }

};int

main()

解法2:滑動視窗法

在本題中視窗表示不含重複字元的子串,用res表示最大不重複子串的長度。

為了計算滑動視窗的長度,我們用left表示視窗的左邊界,視窗的右邊界就是當前遍歷到的字元。

如何判斷字元重複出現?我們需要記錄字元和它出現位置的對映。我們用乙個256位大小的陣列來代替雜湊表表示字元最後出現的位置。該陣列初始化全為0,表示所有字元都還沒出現過。然後不斷滑動視窗右邊界,觀察右邊界對應的字元是否出現過,也即判斷left是否需要更新。若陣列中該字元對應的位置為0,則表示該字元從未出現過,left不變。若陣列中該字元對應的位置不為0,說明該字元之前出現過,但是這個重複字元有可能在滑動視窗內部也有可能在滑動視窗左邊。則接下來判斷該字元是否在滑動視窗內部,若該字元的位置大於left,則表示該字元在滑動視窗內部,則移動left至重複字元處。若該字元的位置小於left,則表示該字元不在滑動視窗內部,無需更新left。

滑動視窗每次向右滑動乙個字元,對應的陣列中字元位置更新為i+1,然後比較res和滑動視窗的大小決定是否更新res。

class

solution, res = 0, left = 0

;

for(int i=0;ii)

//else

//m[s[i]] = i+1;

////精簡寫法

left =max(left, m[s[i]]);

m[s[i]] = i+1

; res = max(res, i-left+1

); }

return

res;

}};

解法2.2: 滑動視窗法

使用了hashmap建立字元和其最後出現位置之間的對映,其他操作同上

class

solution

return

res;

}};

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