Leetcode演算法Java全解答--3. 無重複字元的最長子串
阿新 • • 發佈:2018-12-14
Leetcode演算法Java全解答–3. 無重複字元的最長子串
題目
無重複字元的最長子串
題目
給定一個字串,找出不含有重複字元的最長子串的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 無重複字元的最長子串是 "abc",其長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 無重複字元的最長子串是 "b",其長度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 無重複字元的最長子串是 "wke",其長度為 3。
請注意,答案必須是一個子串,"pwke" 是一個子序列 而不是子串。
想法
- 暴力破解:鎖定位置i、j,判斷i和j之間是否有重複串,時間複雜度n3
- 滑動列表:還是鎖定i、j,不過在遍歷的同時,
如果未發現重複字串,將j往後移
如果發現重複字串,將i往後移
判斷重複使用的是HashSet
結果
執行用時:71 ms
超過41%的解法
時間複雜度n
空間複雜度n
總結
NOT_ANSWER
自己想出來的方法就是暴力破解
有想到載入過的字元不用重複,但是沒有書寫程式碼的思路
小批量字元可以使用陣列代替hashSet
程式碼
我的答案
public int lengthOfLongestSubstring(String s) { int n = s.length(); HashSet<Character> characters = new HashSet<>(); int result = 0; int i = 0; int j = 0; while (i < n && j < n) { if (!characters.contains(s.charAt(j))) { characters.add(s.charAt(j)); j++; result = Math.max(result, j - i); } else { characters.remove(s.charAt(i)); i++; } } return result; }
大佬們的答案
/************************************** * 比我好的答案 better * 這裡使用了int[]代替了HashSet * ***********************************/ public int better(String s) { int n = s.length(), ans = 0; int[] index = new int[128]; // current index of character // try to extend the range [i, j] for (int j = 0, i = 0; j < n; j++) { i = Math.max(index[s.charAt(j)], i); ans = Math.max(ans, j - i + 1); index[s.charAt(j)] = j + 1; } return ans; }
測試用例
@Test
public void test003() {
// 建立測試案例
String s1 = "abcabcbb";
String s2 = "bbbbb";
String s3 = "pwwkew";
// 測試案例期望值
int expResult1 = 3;
int expResult2 = 1;
int expResult3 = 3;
// 執行方法
Solution3 solution3 = new Solution3();
int result1 = solution3.lengthOfLongestSubstring(s1);
int result2 = solution3.lengthOfLongestSubstring(s2);
int result3 = solution3.lengthOfLongestSubstring(s3);
// 判斷期望值與實際值
Assert.assertEquals(expResult1, result1);
Assert.assertEquals(expResult2, result2);
Assert.assertEquals(expResult3, result3);
}
其他
“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改
如有疑問請聯絡,聯絡方式:QQ3060507060