题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 `"abc",所以其`长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 `"b"`,所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 `"wke"`,所以其长度为 3。
请注意,你的答案必须是 **子串** 的长度,`"pwke"` 是一个_子序列,_不是子串。
基于Golang的代码实现如下:
func lengthOfLongestSubstring(s string) int {
// 获取字符串长度
l := len(s)
// 单个字符直接返回
if l <= 1 {
return l
}
// historyMax记录历史保存的最大长度
// currentMax记录当次迭代下最大长度
historyMax, currentMax := 0, 0
// 定义最长无重复字符串的起点下标
start := 0
// 存储字符的最新位置
tmp := map[string]int{}
for i := 1; i <= l; i++ {
// 判断当前字符是否有记录
if v, ok := tmp[s[i-1:i]]; ok {
// 如若有记录,说明发现重复字符,记录当下的最长值
if currentMax > historyMax {
historyMax = currentMax
}
// 当次迭代后的最大长度重新计算为去掉重复字符之前的长度
// 如abca,新的无重复字符串为bca
currentMax = currentMax - v + start + 1
// 删掉重复字符之前所有字符的位置记录
for j := start; j < v; j++ {
delete(tmp, s[j:j+1])
}
// 更新无重复字符串的起点下标
start = v
} else {
// 没有找到重复字符则长度+1
currentMax++
}
// 永远记录当前字符的位置
tmp[s[i-1:i]] = i
}
// 返回最终的max长度
if currentMax > historyMax {
historyMax = currentMax
}
return historyMax
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。