leetcode算法題--無重複字符的最長子串

題目地址: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章