LeetCode 最長不含重複字元的子字串

2021-10-09 10:15:27 字數 1922 閱讀 1796

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。

示例 1:

輸入: "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入: "bbbbb"

輸出: 1

解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: "pwwkew"

輸出: 3

解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。

請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。

* abcabcbb

* dp[j]儲存以j結尾的最長子串

* dp[0] = 1

* dp[1] = dp[0]+1 = 2

* dp[2] = dp[1]+1 = 3

* dp[3] = 3-0 = 3

* dp[4] = 3-0 = 4

* ...

* * i表示上次出現array[j]元素的位置

* * if j-i <= dp[j-1] dp[j] = j-i

* j-i > dp[j-1] dp[j] = dp[j]+1

* * if i不存在 dp[j] = dp[j-1]+1

public

static

intlengthoflongestsubstring

(string s)

//定義dp陣列

int[

] dp =

newint

[s.length()

];//定義map,儲存上次出現的位置

hashmap

map =

newhashmap

<

>()

;int max =1;

dp[0]

=1; map.

put(s.

charat(0

),0)

;for

(int i =

1; i < dp.length; i++

)continue;}

if((i-lastloc)

<= dp[i-1]

)else

map.

put(s.

charat

(i),i);if

(dp[i]

> max)

}return max;

}

這裡其實dp陣列是不需要的,可以使用乙個臨時變數來進行替代

* 解題思路:滑動視窗,定義左右指標,右指標可以一直往前走,走一步判斷是否有重複,

* 有重複左指標收緊視窗直到

* 沒有重複元素,然後做一次位置的記錄

public

static

intlengthoflongestsubstring2

(string s)

hashset

set =

newhashset

<

>()

;int left =

0, right =

0,res =0;

while

(right < s.

length()

) set.

add(c)

;//記錄一次位置

res = math.

max(res,right-left);}

return res;

}

不含重複字元的最長子串

問題描述 給定乙個字串,找到最長的不含重複字元子串。例如,abcabccc 最長不含重複字元的子串為 abc 長度為3。對於 bbbbb 最長的子串為 b 長度為1。解決思路 滑動視窗 維護乙個不包含重複字元 視窗 從左到右掃瞄字串,每當加乙個新字元時,檢查該字元是否存在於 視窗 中,如果不存在則將...

劍指offer 48 最長不含重複字元的子字串

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。定義函式f i 表示以第i個字元為結尾的不包含重複字元的子字串的最大長度。下面以第i個字元之前有沒有出現過重複字元分為兩種情況討論。如果第i個字元之前沒有出現過重複字元,即f f i 1 1。在字串 dhabcacfh 中,顯然...

劍指offer48 最長不含重複字元的子字串

輸入乙個字串 只包含 a z 的字元 求其最長不含重複字元的子字串的長度。例如對於 arabcacfr,最長不含重複字元的子字串為 acfr,長度為 4。方法1 暴力法 判斷乙個字串是否重複 def repeatstring str for i in range len str 1 for j in...