题解 | #最长不含重复字符的子字符串#

最长不含重复字符的子字符串

https://www.nowcoder.com/practice/48d2ff79b8564c40a50fa79f9d5fa9c7?tpId=13&tqId=2276769&ru=%2Fpractice%2F2237b401eb9347d282310fc1c3adb134&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D13

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param s string字符串
 * @return int整型
 */
func lengthOfLongestSubstring(s string) int {
	// write code here
	if len(s) == 0 {
		return 0
	}

	// dp[i] 表示以 s[i] 结尾的最长无重复子串长度
	dp := make([]int, len(s))

	// lastIndex 记录字符上一次出现的位置
	lastIndex := make(map[byte]int)

	dp[0] = 1           // 第一个字符子串长度为1
	lastIndex[s[0]] = 0 // 记录第一个字符的位置
	maxLen := 1         // 记录全局最长子串长度

	for i := 1; i < len(s); i++ {
		lastPos, found := lastIndex[s[i]]

		if found && lastPos >= i-dp[i-1] {
			// 如果字符在 dp[i-1] 子串内出现过
			dp[i] = i - lastPos
		} else {
			// 如果没有出现过或者不在 dp[i-1] 子串内
			dp[i] = dp[i-1] + 1
		}

		// 更新字符位置
		lastIndex[s[i]] = i

		// 更新最大长度
		if dp[i] > maxLen {
			maxLen = dp[i]
		}
	}

	return maxLen
}

全部评论

相关推荐

04-25 18:13
五邑大学 Java
后来123321:大二两段实习太厉害了,我现在大二连面试都没有
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务