LeetCode 3_Longest Substring Without Repeating Characters
LeetCode 3_Longest Substring Without Repeating Characters
題目描寫敘述:
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
也就是尋找字符串中的不含反復元素的最長子串的長度。
首先非常easy想到的是暴力法:外兩層循環在字符串中不斷的掃描子串,內兩層循環用來推斷子串是否是有反復字符。
顯然這樣的方法時間復雜度有點高為O(n^4)?;旧喜荒軌虮唤邮?。
在上面的方法中。推斷子串是否有反復的過程中能夠不用用兩層循環來掃描。能夠使用哈希表的方法推斷。代碼例如以下:
<span style="font-size:18px;">class Solution { public:int lengthOfLongestSubstring(string s) {int i,j; int maxLength = 0; int hash[256]; int n = s.size();for(i = 0; i < n; ++i){memset(hash,0,sizeof(hash)); hash[s[i]] = 1; for(j=i+1; j<n; ++j) { if(hash[s[j]] == 0) hash[s[j]] = 1; else break; } if(j-i > maxLength) maxLength = j-i; }return maxLength;} };</span>
上面的方法時間復雜度為O(n^2),以下給出LeetCode的參考答案,時間復雜的為O(n),并且代碼很easy!真實不得不佩服大牛。。。
思路:使用i和j兩個指針進行搜索,i代表候選的最長子串的開頭。j代表候選的最長子串的結尾。
先如果i不動。右移j。直到j到達原字符串的結尾,此時j-i就構成了一個候選的最長子串。
每次都維護一max_length,就能夠選出最長子串了。如果字符j已經反復出現過(如果在位置k),就須要停止右移了。
記錄當前的候選子串并和max_length做比較。
以下就是一個非常好的處理,還真沒想到。
在下一次搜尋中,i應該更新到k+1。這句話的意思是。用這個樣例來理解。abcdef是個不反復的子串,abcdefc中(為了方便記錄為abc1defc2),c1和c2反復了。那么下一次搜尋,應該跨過出現反復的地方進行,否則找出來的候選串依舊有反復字符,且長度還不如上次的搜索。所下面一次搜索。直接從c1的下一個字符d開始進行。也就是說,下一次搜尋中,i應該更新到k+1。
代碼例如以下:
class Solution { public:int lengthOfLongestSubstring(string s) {int i = 0, j = 0;int maxLength = 0;bool exist[256] = {false};int n = s.length();while (j < n){if (exist[s[j]])<span style="white-space:pre"> // 由于s[j] 中的是字符。能夠自己主動轉換為整型</span>{maxLength = max(maxLength, j - i);while(s[i] != s[j]){exist[s[i]] = false;i++;}i++;j++;}else{<span style="white-space:pre"> </span>exist[s[j]] = true;j++;}}maxLength = max(maxLength, n-i);<span style="white-space:pre"> // 別忘了這一步</span>return maxLength;} };
總結
以上是生活随笔為你收集整理的LeetCode 3_Longest Substring Without Repeating Characters的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【矩阵乘法】OpenJ_POJ - C1
- 下一篇: Python 字符串操作基础