標籤:style blog color ar for sp div art 問題
這題看起來挺簡單的,就是存一個雜湊表<char, 字元位置>,然後依次遍曆整個字串,遇到前面有過的字元的時候,就該停止當前計數,新的子串應該從發現該字元的位置的下一位置開始。
我開始寫了一個簡單的寫法,發現逾時了:
if (s.empty())return 0;if (s.length() == 1)return 1;int longest = 1;for (int i = 0; i < s.length(); i++){int len = 0;unordered_map<char, int> substr;int index = i;while (i < s.length() && (substr.find(s[i]) == substr.end() || substr.find(s[i])->second == index) ){if (substr.find(s[i]) == substr.end()){substr[s[i]] = i;len++;}else {substr[s[i]] = i;}i++;}if (len > longest)longest = len;if (i < s.length()){i = substr.find(s[i])->second + 1;}//i = index;}return longest;
我這裡的問題是發現重複字元的時候,字串指標不應該回溯,這是很浪費的!
其實只需要修改字串開始位置就可以了。還有就是雜湊表要隨時儲存某字元的最右邊的位置。
int lengthOfLongestSubstring(string s) { if (s.empty()) return 0; if (s.length() == 1) return 1; unordered_map<char, int> charIndex; int start = 0; int longest = 1; int len = 1; charIndex[s[0]] = 0; for (int i = 1; i < s.length(); i++){ if (charIndex.find(s[i]) == charIndex.end()){ charIndex[s[i]] = i; len++; } else{ if (charIndex[s[i]] > start){ if (len > longest) longest = len; len -= charIndex[s[i]] - start; start = charIndex[s[i]] + 1; } else if (charIndex[s[i]] == start){ start += 1; } else { len++; } charIndex[s[i]] = i; } } if (len > longest) longest = len; return longest; }
Longest Substring Without Repeating Characters