3 無重複字元的最長子串

2022-06-09 21:42:12 字數 1664 閱讀 4448

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

示例 1:

輸入: "abcabcbb"

輸出: 3

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

示例 2:

輸入: "bbbbb"

輸出: 1

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

示例 3:

輸入: "pwwkew"

輸出: 3

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

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

方法一:

首先想到的是用兩個迭代器iter iter2,看iter2所指向的字元是否存在於[iter,iter2]substring中,使用的是string的find_first_of

時間複雜度:o(n²)

int lengthoflongestsubstring(string

s)

int maxlen = -1

;

int len = 0

; auto iter =s.begin();

auto iter2 =s.begin();

for (; iter != s.end(); iter++)

iter2++;

//cout << "maxlen:" << maxlen << endl;

}

else

//cout << "maxlen2:" << maxlen << endl;

break

; }};}

return

maxlen;

}

提交後,所佔記憶體、執行時間都只超過5%,暴力遍歷效果較差。

方法二:

string每個字元是乙個char,而char的範圍為0-127,因此建立乙個char[128] map來儲存所有出現的字元,以s[i]作為key,如果存在則map[s[i]]++,如果map[s[j]]的值》1則表示出現了多次,即存在重複的字元。

使用兩個索引滑動視窗,滿足條件的不重複長度為:j-i+1

**如下:

int lengthoflongestsubstring3(string

s)

int maxlen = 0

;

char map[130] = ;

int i = 0, j = 0

;

for (; j < s.length(); j++)

if (j - i + 1 >maxlen)

}return

maxlen;

}

提交結果:

總結:1.感覺leetcode提交後,執行時間的排名不准,同樣的**提交幾次,排名差別有百分幾的浮動。

2.同樣的問題,不同的**的執行效率及記憶體占用差別還是很巨大的;

3.現在工作時,只注意完成功能,從來沒有考慮到**效率問題,而且沒有**審核環境,提高很慢;

4.閒著也是閒著,還是堅持刷題吧 ;

3 無重複字元的最長子串

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

3 無重複字元的最長子串

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

3 無重複字元的最長子串

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