給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。
示例 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提交後,所佔記憶體、執行時間都只超過5%,暴力遍歷效果較差。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;
}
方法二:
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解釋 因為...