題目地址:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/submissions/
這道題我一開始給想複雜了,核心的思路就是一個滑動窗口法。
第一次通過的代碼是參考題解中第3中方案做的。
代碼如下:
int lengthOfLongestSubstring(string s) {
if(s=="")
return 0;
int max=1;
map<char,int>imap;
int length=s.size();
map<char,int>::iterator iter;
for(int i=0,j=0;j<length;j++){
iter=imap.find(s[j]);
if(iter!=imap.end()){
i=std::max(i,iter->second);
}
imap[s[j]]=j+1;
max=std::max(j-i+1,max);
}
return max;
}
中間i=std::max(i,iter->second);
這裏我不太明白,於是我又看了題解2,我發現其實沒那麼難,是我想複雜了。
這題的子串首先是連續的,這個很重要,然後按照題解2的做法就很簡單了。
代碼:
int lengthOfLongestSubstring(string s) {
if (s == "")
return 0;
deque<char> ideq;
deque<char>::iterator iter;
int max_len = 1;//記錄最長子串的長度
int tmp = 0;
int length = s.size();
for (int i = 0; i < length; i++)
{
iter = find(ideq.begin(), ideq.end(), s[i]);
if (iter != ideq.end())
ideq.erase(ideq.begin(), ++iter);//如果在隊列中存在相同字符,就刪除及其之前部分
ideq.push_back(s[i]);
tmp = ideq.size();//隊列的長度即是子串的長度
max_len = max(max_len, tmp);
}
return max_len;
}