最長無重複字符的子串

描述:給定一個字符串,請找出其中無重複字符的最長子字符串。
樣例
例如,在”abcabcbb”中,其無重複字符的最長子字符串是”abc”,其長度爲 3。
對於,”bbbbb”,其無重複字符的最長子字符串爲”b”,長度爲1。

分析:剛開始其實也找不出思路,後面參考了網上,才理解了。總共字符有256個,可以建立一個大小爲256的數組,用來記錄每個字符出現的位置。字符出現一次,就將其位置傳遞給數組相應的的元素。爲了計算長度,我們還得建立一個變量left來記錄無重複字符串的最左端的位置,然後用當前位置-left+1,即可得到長度。

    /*
     * @param : a string
     * @return: an integer
     */
    int lengthOfLongestSubstring(string s) {
        // left用以記錄合法的最遠左邊界位置,last記錄字符上一次出現的位置
        int ans = 0, left = 0, len = s.length();
        int last[255];//用來存放每個字符出現的最新位置信息
        memset(last, -1, sizeof last);//將last數組全部元素置爲-1

        for (int i = 0; i < len; i++) {
            // 上次出現位置在當前記錄邊界之後,即該子串中出現了重複字符,需調整left使得子串合法
            if (last[s[i]] >= left) //表明字符串出現了重複字符,s[i]表示每個字符的ASCII碼值
                left = last[s[i]] + 1;//更新不重複字符串最左端位置,left存放的即是不重複字符串最左端位置
            last[s[i]] = i;//將字符出現的最新的位置存入數組對應的元素
             ans = max(ans, i - left + 1);//計算不重複字符串長度
        }
        return ans;

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章