1. 程式人生 > >leetcode : Longest substring without repeating characters

leetcode : Longest substring without repeating characters

  這是我第一次發微博,之前一直都是在有道雲筆記上記錄平時的學習。今天看到CSDN的部落格平臺如此強大,還支援latex公式(),在latex下輸入公式真的很爽。 從今天開始打算一點點轉移到部落格平臺,和更多的人分享,學習。
  最近在刷leetcode, 感覺有點吃力,好多思路還是摸不著頭腦。不過我相信多看,多練,多思考,肯定會越來越順的。不扯沒用的了,下面直接上題:
  題目描述
  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.
  分析


  在一個給定字串中查詢無重複字元的最長子串的長度。可以定義一個空的字串str, 然後從頭遍歷給定字串s, 每遍歷一個字元c則在str中查詢,看c是否在str中存在,如果存在則將str中從起始字元到字元c的子串刪除,然後將此遍歷字元在插入到str的後面。如果在str中不存在c, 則直接將c插入到str的後面。整個過程中儲存str字串長度的最大值。

    class Solution{
    public:
        int lengthOfLongestSubstring(string s){
            if(s.size() < 2)
                return
s.size(); string str = ""; int num = 0; str += s[0]; for(int i=0; i<str.size(); ++i){ int pos = str.find(s[i]); if(pos == string::npos){ str += s[i]; } else{ if
(str.size() > num){ num = str.size(); } str.erase(0, pos+1); str += s[i]; } } if(str.size() > num){ num = str.size(); } return num; } };

以上演算法是我自己想出來的,對於每一個遍歷到的字元都需要在str中find一遍,比較耗時。下面是leetcode題解上的答案,它使用了一個大小為26的陣列,記錄每一個字元是否出現過,以及出現的位置。因此遍歷每一個字元時,只需要在陣列中看此字元的位置是否已經賦過值,如果已經有值,則表示重複。那麼下一次計算字串長度的起始位置就從此重複字元的位置的下一個位置開始。遍歷過程中儲存不重複子串長度的最大值。

class Solution{
public:
    int lengthOfLongestSubstring(string s){
        const int ASCII_MAX = 26;
        int last[ASCII_MAX];  //記錄字串上次出現的位置
        int start = 0;  //記錄當前子串的起始位置
        fill(last, last+ASCII_MAX, -1);
        int max_len = 0;
        for(int i=0; i<s.size(); s++){
            if(last[s[i]-'a'] > start){
                max_len = max(max_len, i-start);
                start = last[s[i]-'a'] +1;
            }
            last[s[i]-'a'] = i;
        }
        return max(max_len, (int)s.size()-start);   //最後一次
    }
};