解法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。
classsolution, 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建立字元和其最後出現位置之間的對映,其他操作同上
classsolution
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.給定字串,找到最長無重複字...