【字符串】3. 无重复字符的最长子串
题目:

解答:
怎么确认一个字符是否已经存在于子串中呢?策略是用一个表存储已经出现过的字符。
请向面试官沟通交流:给定的字符串除了'a' - 'z'外,是否还有其他字符,比如Digits、Upper case letter。是否只是包含ASCII码?或者Unicode字符集合?

实现一:
1 class Solution { 2 public: 3 int lengthOfLongestSubstring(string s) 4 { 5 if(s.size() == 0) 6 { 7 return 0; 8 } 9 unordered_set<char> lookup; 10 int maxStr = 0; 11 int left = 0; 12 for(int i = 0; i < s.size(); i++) 13 { 14 while (lookup.find(s[i]) != lookup.end()) 15 { 16 lookup.erase(s[left]); 17 left++; 18 } 19 20 maxStr = max(maxStr, i - left + 1); 21 lookup.insert(s[i]); 22 } 23 return maxStr; 24 } 25 };
实现二:
1 class Solution { 2 public: 3 int lengthOfLongestSubstring(string s) 4 { 5 int n = s.length(); 6 7 int i = 0; 8 int j = 0; 9 10 int maxLen = 0; 11 12 bool exist[256] = { false }; 13 14 while (j < n) 15 { 16 if (exist[s[j]]) 17 { 18 maxLen = max(maxLen, j-i); 19 //更新i和exist数组,将j之前exist[]全部置为false 20 while (s[i] != s[j]) 21 { 22 exist[s[i]] = false; 23 i++; 24 } 25 i++; 26 j++; 27 } 28 else 29 { 30 exist[s[j]] = true; 31 j++; 32 } 33 } 34 //最后一个哦,不要忘记 35 maxLen = max(maxLen, n-i); 36 return maxLen; 37 } 38 };

浙公网安备 33010602011771号