題號0003 無重複最長子串

2021-10-02 11:13:04 字數 1699 閱讀 8821

題目位址

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。

輸入: "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

輸入: "bbbbb"

輸出: 1

解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

輸入: "pwwkew"

輸出: 3

解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。

請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。

題目目的很明確,乙個子串中不含重複字元,找到最長的子串,計算長度。

基本想法:一次遍歷,定義了兩個索引,起始位置和結束位置,如果當前遍歷(結束位置)的字元已經出現過,就更新起始位置,重新計算長度。

第一次提交:

step 1定義了兩個索引,分別代表字串開始(indexbegin)和(indexend)

step 2外迴圈遍歷每個字元,索引為indexend

step 3內迴圈從起始位置indexbegin,遍歷到indexend,檢測

之間每個字元與外迴圈的indexend的字元是否重複;

step 4如果字元重複,將indexbegin更新到內迴圈索引i+1的位置,作為下次內迴圈的開始;

int lengthoflongestsubstring1(string s) 

}auto templen = indexnext - indexbegin + 1;

retmaxlen = max(retmaxlen, templen);

}return retmaxlen;

}

結果:執行時間 20ms,記憶體消耗 9 mb。

結果看來,兩層迴圈跑了987個用例果然耗時。

2.於是二次提交

檢視了題解,明白了2個點:

1、這種起始索引,結束索引組成的就是「滑動視窗」,不斷往後滑動,動態變動視窗大小;

2、如果想提公升時間效率,自然需要空間換時間。原本第一次的方案:查詢重複的字元的位置,這耗費時間。

於是第二次提交,使用hash表來記錄字元的index。這裡使用乙個vector(128, -1),每個index代表字元的ascii碼,值為index。

int lengthoflongestsubstring(string s) 

// 計算最大長度

auto templen = indexnext - indexbegin + 1;

retmaxlen = max(retmaxlen, templen);

// 更新出現字元位置

vechasshowchar[s[indexnext]] = indexnext;

}return retmaxlen;

}

結果:執行時間 8ms,記憶體消耗 9.9 mb。

無重複字元最長子串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...

查詢無重複最長子串

給定乙個字串,請找出其中長度最長且不含有重複字元的子串,計算該子串長度。輸入描述 輸入型別為字串,例如 pwwkew 輸出描述 輸出型別為整型,例如 5 示例1輸入 pwwkew 輸出說明 無重複字元的最長子串是 wke 其長度為 3 思路 利用map,value記錄是否出現過。include in...

無重複字元最長子串

題目描述 給定乙個字串,找出不含有重複字元的 最長子串 的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是子串行而不是子串 i...