1. 程式人生 > >Leetcode演算法Java全解答--3. 無重複字元的最長子串

Leetcode演算法Java全解答--3. 無重複字元的最長子串

Leetcode演算法Java全解答–3. 無重複字元的最長子串

題目

無重複字元的最長子串

題目

給定一個字串,找出不含有重複字元的最長子串的長度。

示例 1:

輸入: "abcabcbb"
輸出: 3
解釋: 無重複字元的最長子串是 "abc",其長度為 3。

示例 2:

輸入: "bbbbb"
輸出: 1
解釋: 無重複字元的最長子串是 "b",其長度為 1。

示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 無重複字元的最長子串是 "wke",其長度為 3。
請注意,答案必須是一個子串,"pwke" 是一個子序列 而不是子串。

想法

  1. 暴力破解:鎖定位置i、j,判斷i和j之間是否有重複串,時間複雜度n3
  2. 滑動列表:還是鎖定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