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.
这道题找字符串中不重复字符的最长子串长度,难度为Medium。
- 首先想到的是用HashTable。从字符串头部开始计算子串,将没有重复出现的字符存入HashTable中,如果遇到相同的字符,表明当前不重复子串已经结束,从HashTable中查到的重复字符位置开始重新计算子串,比较确定此子串是否是当前最长的,遍历整个字符串后得到不重复字符的最长子串长度。具体代码:
class Solution { public: int lengthOfLongestSubstring(string s) { unordered_map<char, int> hash; int maxLen = 0; int pos = -1; for(int i=0; i<s.size(); i++) { auto it = hash.find(s[i]); if((it != hash.end()) && (it->second >= pos)) { pos = it->second; } hash[s[i]] = i; maxLen = max(maxLen, i-pos); } return maxLen; } };
- 通过之后查看了别人的代码,发现有不用HashTable的方法,非常巧妙,用字符ascii码做下标把字符位置存入vector中,避免使用HashTable,效率上有所提高,复制其代码供大家参考:
class Solution { public: int lengthOfLongestSubstring(string s) { vector<int> dict(256, -1); int maxLen = 0, start = -1; for (int i = 0; i != s.length(); i++) { if (dict[s[i]] > start) start = dict[s[i]]; dict[s[i]] = i; maxLen = max(maxLen, i - start); } return maxLen; } };