最長無重複子串問題 leetcode 3

一.代碼及註釋spa

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.size(); //字符串的長度
        int ans = 0;  //最長無重複子串的長度
        //創建map表 key爲字符 val爲該字符的下一個座標位置
        //val取符號座標+1用於更新start
        unordered_map<char,int> m; 
        //定義start和end end即爲當前字符,不斷+1
        for(int start=0,end=0;end<n;end++){
            //當前字符爲c
            char c = s[end];
            //若是map中有當前字符(即出現了重複的字符),則進入if語句
            if(m.find(c)!=m.end()){
                /*
                兩種狀況:
                1.若是start比m[c]小,如pwwkew,start爲2,end爲5兩個w相等
                則start就更新爲3,以end爲結尾的最長無重複子串才能是5-3+1=3;
                2.若是start比m[c]大,如kwawk,如圖所示,start爲2,end爲5,須要
                start保持不變
                */
                start = max(m[c],start);
            }
            //ans更新,end-start+1即以當前end爲結尾的最長無重複串
            ans = max(ans,end-start+1);
            //添加數據
            m.erase(c);
            m.insert(make_pair(c,end+1));
        }
        return ans;
    }
};

二.圖解code

 

三.須要map的知識點(經常使用總結)blog

map的插入:經常須要和刪除配合使用字符串

map.erase(key);string

map.insert(make_pair(key,val));it

map的訪問:直接經過訪問下標io

m[下標];class

map的循環awk

auto iter = m.begin();循環

while(iter!=m.end()){

  cout<<iter.first()<<endl;  //輸出key

  cout<<iter.second()<<endl;//輸出val

}

map的查找

m.find(key);返回的是迭代器,可用m.find(key)!=m.end()判斷是否存在該key。

m.count(key);返回迭代器的數量,用於可重複的map。

相關文章
相關標籤/搜索