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

2021-08-23 12:03:12 字數 2304 閱讀 2452

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

示例:

給定"abcabcbb",沒有重複字元的最長子串是"abc",那麼長度就是3。

給定"bbbbb",最長的子串就是"b",長度是1。

給定"pwwkew",最長子串是"wke",長度是3。

請注意答案必須是乙個子串,」pwke」 是 子串行 而不是子串。

這裡以"abcabcbb"作為例子:

最簡單能想到的,就是遍歷這個字串的所有子串了,要按順序寫出來比較不會亂:ab, abc, abca, abcab , abcabc, ……, abcabcbb, bc, bca, ……(注意這裡我從長度為2的子串開始判斷,max_len初始化為1,只要輸入字串不為」「,那麼子串長度至少為1)

存在的問題:

時間複雜度為 o(n3),遍歷所有子串是兩層迴圈,然後判斷是否重複又是一層,當然判斷重複這個可以改進,後續再說。

而且這樣做有乙個問題,就是會增加冗餘的判斷:比如abca已經判斷是含有重複字元的子串了,那麼其實沒必要再去對後續的包含該重複子串abca的子串如:abcab等進行判斷。

如下圖所示,當我們遍歷到的子串含有重複字元的時候,可以跳出內層迴圈,進入下乙個起始的下標:

**如下:

int lengthoflongestsubstring(string s) 

else}}

return max_len;

}

存在的問題1:這樣做是能減少很多時間,但是由於檢查子串含有重複字元的函式checkduplicate的時間複雜度為 o(n),我一開始是從頭到尾遍歷子串,通過map資料結構來判斷的,如果該字元在map中未儲存,則儲存下來,如果已經有儲存了,說明有重複,則直接返回true表示該子串有重複字元。

這個函式的複雜度為o(n2),這樣一來提交sol的時候會超時:

bool checkduplicate(string s)

else

}return

false; // 沒有重複

}

改進:用空間換時間的思路,建立乙個hash table,初始化都為0,然後如果該字元未在雜湊表中出現則置為1,如果該字元已經出現則也是返回true。這裡我理解的是每個字元都有對應的ascii碼:

bool checkduplicate(string s)

else

}return

false; // 沒有重複

}

存在的問題2:改完上面的問題,還是會超時,這時我就想,會不會是尋找子串的過程還是有多餘的地方。想了想果然是!

比如,對於輸入字串abcabcbh, 當我max_len為3的時候,那麼其實我並不需要去檢視 子串起始字元下標為 5,6的子串情況的,因為就算字元起始下標為5,那麼cbh這個子串長度為3,即就算這個子串不含重複字元,最好的情況也就只是3:

改進:

在子串起始的遍歷的迴圈中,加入乙個判斷max_len是否 ≥s_sz - i的判斷,如果是則直接退出迴圈返回』max_len』即可

for (int i = 0; i < s_sz; i++)

else

}return

false; // 沒有重複

}int lengthoflongestsubstring(string s)

else}}

return max_len;

}

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