【leetcode】3. Longest Substring Without Repeating Characters

/**
 * 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.
 *
 */
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int lengthOfLongestSubstring(string s) {

    int str_len = s.size(), i =0, max_len = 0, len = 0, start = 0;

    //可見字符最多256個
    vector<int> hash(256, -1);

    for (; i < str_len; i++)
    {
        //hash[s[i]] < 0 是新字符
        //hash[s[i]] < start 是之前出現過,但已廢棄,start是重複字符之後一位的位置
        // 例如: abcdb
        // 我們遍歷到abcd,然後發現b重複,那麼後面其實是從c開始,start記錄c的位置
        // 但是a由於b的影響也就被作廢了,但是這個時候a在hash中
        // 的下標還是0,但是小於start,所以相當於也是合法的字符
        if (hash[s[i]] < 0 || hash[s[i]] < start)
        {
            len++;
        }
        else
        {
            max_len = max_len > len ? max_len : len;
            //記錄不重複字符的長度,減去重複字符之前的長度
            len -= hash[s[i]] - start;
            //start是重複字符之後一位的位置
            start = hash[s[i]] + 1;

        }
        hash[s[i]] = i;     
    }
    return max_len > len ? max_len : len;
}

int lengthOfLongestSubstring1(string s) 
{
    vector<int> dict(256, -1);
    int maxLen = 0, start = -1;
    for (int i = 0; i != s.length(); i++) {
        if (dict[s[i]] > start)
            start = dict[s[i]];
        dict[s[i]] = i;
        maxLen = max(maxLen, i - start);
    }
    return maxLen;
}

int main()
{
    //string s("abcdbefgbijklmnopqb");//13
    string s("abcdbefgb"); //6
    cout << lengthOfLongestSubstring(s) << endl;
    system("pause");
    return 0;
}
發佈了37 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章