leetcode倒数第三题,地址:http://oj.leetcode.com/problems/longest-substring-without-repeating-characters/
思路:用deque和map来模拟,从后插入deque,同时map存一份表示此char已存入,当发现当前char已存入deque的时候,从deque的front开始pop,知道把与当前char相同的char 给pop出去,同时map也做维护,当q的size最大时,也就是要返回的值。
形象上就是两个指针一前一后在移动,有char进来并不与两指针之间的char重复的时候,后指针移动(往后),否则前指针移动(往后)到重复char的后一位置。map维护快速查询。
参考代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int maxlen = 0, len = 0;
deque<char> q;
map<char, bool> resmap;
for(int i = 0; i < s.length(); ++i)
{
auto it = resmap.find(s[i]);
if(it == resmap.end())
{
++len;
q.push_back(s[i]);
maxlen = maxlen > len ? maxlen : len;
resmap.insert(pair<char,bool>(s[i], true));
}
else
{
while(!q.empty() && q.front() != s[i])
{
auto deleteIt = resmap.find(q.front());
resmap.erase(deleteIt);
q.pop_front();
}
q.pop_front();
q.push_back(s[i]);
len = q.size();
}
}
return maxlen;
}
};
SECOND TRIAL, 204MS
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.empty())
return 0;
unordered_map<char, int>mp;
unordered_map<char, int>::iterator it;
int i = 0, mlen = 0;
for(int k = 0; k<s.length(); ++k)
{
it = mp.find(s[k]);
if(it == mp.end())
mp[s[k]]=k;
else
{
while(s[i]!=s[k])
{
it = mp.find(s[i]);
mp.erase(it);
++i;
}
++i;
}
mlen = max(mlen, k-i+1);
}
return mlen;
}
};
PYTHON VERSION, 392MS
class Solution:
# @return an integer
def lengthOfLongestSubstring(self, s):
if not s:
return 0
d = {}
maxlen = i = 0
for j in range(0, len(s)):
if not d.has_key(s[j]):
d[s[j]] = j
else:
while s[i] != s[j]:
del d[s[i]]
i+=1
i+=1
maxlen = max(maxlen, j-i+1)
return maxlen