【字符串】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 };

 

posted @ 2020-05-03 16:50  梦醒潇湘  阅读(171)  评论(0)    收藏  举报