leetcode刷題筆記-3. 無重複字元的最長子串(java實現)
阿新 • • 發佈:2020-08-10
題目描述
給定一個字串,請你找出其中不含有重複字元的最長子串的長度。
示例1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是"wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke"是一個子序列,不是子串。
來源:力扣(LeetCode) 連結:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
解題思路
遍歷字串,如果set中沒有,長度累加,並加入set中,如果當前字串最大長度大於以往的長度,更新最大長度;如果set中存在,清空set,清空子串長度,從開始計運算元串長度位置的下一位開始重新計算,直到把整個字串全都遍歷完成。
解題程式碼
下邊的程式碼,執行用時:146ms記憶體消耗:38.8MB。(應該還有更好方案,後期想到了再更新)
class Solution { public int lengthOfLongestSubstring(String s) { int result = 0; int resultR = 0; int sig = 0;//子串開始位置 Set<String> sSet = new HashSet<String>(); for(int i=0; i<s.length(); i++) { if(sSet.contains(s.charAt(i)+"")) {//判斷子串是否重複 sSet.clear(); result = 0; sig++; i = sig;//設定子串開始位置,從開始位置往後進行遍歷 } result++;//子串長度 if(resultR < result) {//保留子串長度最大值 resultR = result; } sSet.add(s.charAt(i)+""); } return resultR; } }