3. 无重复字符的最长子串

题目

3. 无重复字符的最长子串 - 力扣(LeetCode)

思路

动态规划+哈希表

状态定义dp[j] 代表以字符 s[j] 为结尾的 “最长不重复子字符串” 的长度。
转移方程: 固定右边界 j ,设字符 s[j] 左边距离最近的相同字符为 s[i] 。

dp[j+1]={dp[j]+1,i∣∣dp[j]<jiji,dp[j]ji

双指针

代码

动态规划

func lengthOfLongestSubstring(s string) int {
	mp := map[rune]int{}
	dp := make([]int, len(s)+1)
	dp[0] = 0
	res := 0
	for j, v := range s {
		i, ok := mp[v]
		mp[v] = j
		if !ok || dp[j] < j-i {
			dp[j+1] = dp[j] + 1
		} else {
			dp[j+1] = j - i
		}
		if res < dp[j+1] {
			res = dp[j+1]
		}
	}
	return res
}

双指针

func lengthOfLongestSubstring(s string) int {
	mp := map[rune]int{}
	res := 0
    l := -1
	for r, v := range s {
		if i, ok := mp[v]; ok{
            l = max(l,i)
        }
		mp[v] = r
		res = max(res, r-l)
	}
	return res
}
func max(x,y int) int{
    if x > y{
        return x
    }
    return y
}