題目描述
給定一個字串,請你找出其中不含有重復字符的 最長子串 的長度,
示例 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,清空子串長度,從開始計算子串長度位置的下一位開始重新計算,直到把整個字串全都遍歷完成,
解題代碼
下邊的代碼,執行用時:146 ms 記憶體消耗:38.8 MB,(應該還有更好方案,后期想到了再更新)
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;
}
}
代碼倉庫
gitee:https://gitee.com/Tong_Cheng_Yu/leetcode/tree/master
github:https://github.com/t-c-y/leetcode
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/5288.html
標籤:其他
上一篇:leetcode刷題筆記-2. 兩數相加(java實作)
下一篇:KMP演算法及其改進演算法
