LeetCode3:Longest Substring Without Repeating Characters(無重複字符的最長子串)

LeetCode3:Longest Substring Without Repeating Characters(無重複字符的最長子串)

歡迎訪問個人博客java

LeetCode:https://leetcode.com/problems/longest-substring-without-repeating-characters/git

LeetCodeCn:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/github

題目說明

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。spa

示例

  • 示例 1:
    • 輸入: "abcabcbb"
    • 輸出: 3
    • 解釋: 由於無重複字符的最長子串是 "abc",因此其長度爲 3。
  • 示例 2:3d

    • 輸入: "bbbbb"
    • 輸出: 1
    • 解釋: 由於無重複字符的最長子串是 "b",因此其長度爲 1。
  • 示例 3:code

    • 輸入: "pwwkew"
    • 輸出: 3
    • 解釋: 由於無重複字符的最長子串是 "wke",因此其長度爲 3。 請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

解題方法

平常暴力法

遍歷每一個元素做爲一個字符串開始,查找當前字符串是否元素不重複,若是不重複則獲得其長度,所有遍歷獲得其最長無重複自串長度.cdn

滑動窗口(HaskMap輔助表)

HaskMap真是個好東西,最近再整理下HashMap相關的資料blog

此方法只須要一次遍歷便可,主要思路爲在遍歷過程當中計算當前遍歷位置到最後一個重複元素的下一位位置的長度(也能夠說是將最後一次重複的元素的下一位做爲一個子串的開始,當前遍歷位置做爲子串的結束,計算此子串的長度),將其與已存在的最長子串長度對比,獲得當前最長未重複元素子串的長度.下面經過圖示解析相關思路.leetcode

圖解相關思路

咱們輸入"pwwkew"做爲參數,此時默認最長無重複子串長度(result)爲0,HashMap輔助表check爲空.字符串

輸入條件

默認遍歷位置i = 0, 默認最後一個重複元素的下一位位置index = 0;

查找輔助表check中不存在i位置對應的元素p

當前最長無重複元素子串長度result = i(0) - index(0) + 1 = 1

更新check表,將(p,0)加入到check表中

i=0

繼續遍歷此串,當i = 1時,check中依舊查找不到i位置對應的元素w

result = i(1) - index(0) + 1 = 2

更新check表,將(w,1)加入到check表中

i=1

繼續遍歷當i = 2時,此時i對應的元素w在check表中能夠被找到,說明此元素是一個重複元素,咱們須要更新index的值,在這裏咱們比較當前index的值和check中出現的最後一次重複元素的下一位中的較大值(防止"abba"這樣的在遍歷最後一個a的時候取到首位a的位置).

i=2(0)

此時index = max(index(0), check.get(key("w")) (1 + 1 = 2)) = 2

計算當前的result = i(2) - index(2) + 1 = 1,小於以前的result(2),此時result依然爲2.

更新check表的內容,將key爲w的value更改成2

i=2(1)

繼續遍歷,當i = 3時,check表中找不到'k'

result = i(3) - index(2) + 1 = 2

更新check表,將(k,3)加入到check表中

i=3

繼續遍歷,當i = 4時,check表中找不到'e'

result = i(4) - index(2) + 1 = 3, 此時的result大於原有的result,則更新result的值爲3

更新check表,將(e,4)加入到check表中

i=4

繼續遍歷當i = 5時,此時i對應的元素w在check表中能夠被找到,

i=5(0)

此時index = max(index(5), check.get(key("w")) (2 + 1 = 3)) = 5

計算當前的result = i(5) - index(2) + 1 = 3,大於以前的result(2),此時result更新爲3.

更新check表的內容,將key爲w的value更改成5

i=5(1)

至此,遍歷結束,此時reslut的值就是s中最長爲重複子串的長度.

代碼實現

public int lengthOfLongestSubstring(String s) {
    int result = 0;
    Map<Character, Integer> check = new HashMap<>();
    for (int i = 0, index = 0; i < s.length(); i++) {
        if (check.containsKey(s.charAt(i))){
            index = Math.max(index, check.get(s.charAt(i)) + 1);
        }
        result = Math.max(result, i - index + 1);
        check.put(s.charAt(i), i);
    }

    return result;
}
複製代碼

相關代碼歡迎你們關注並提出改進的建議

相關文章
相關標籤/搜索