給定乙個字串,找出不含有重複字元的最長子串的長度。這裡以示例:
給定
"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.給定字串,找到最長無重複字...