請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。
示例 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...