題目位址
給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。
輸入: "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。2.於是二次提交結果看來,兩層迴圈跑了987個用例果然耗時。
檢視了題解,明白了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...