LeetCode题解 5. Longest Substring Without Repeating Characters
题目
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given “abcabcbb”, the answer is “abc”, which the length is 3.
Given “bbbbb”, the answer is “b”, with the length of 1.
Given “pwwkew”, the answer is “wke”, with the length of 3.
Note that the answer must be a substring, “pwke” is a subsequence and not a substring.
题目大意:从一个字符串中找到最长无重复的子串。
思路
顺序遍历字符串,用一个map记录每个字符的出现次数;
当有字符重复时,记录下从开始位置到当前前一个位置的子串与长度;
在与最长子串进行长度比较,取出最长子串;
清空map,继续按照之前的位置往下遍历查找子串。
代码实现(Go语言)
package main
import (
"fmt"
)
func main() {
str := "abcbefd"
size := len(str) // 字符串长度
var maxLength int // 最大子串长度
var maxStr string // 最长子串
set := make(map[byte]int32, 0) // 用来记录字符出现次数
// 循环遍历字符串
for i := 0; i < size; i++ {
var index int // 用来记录重复字符出现的位置
for j := i; j < size; j++ {
// 当字符重复时,记录位置,退出当前循环
if set[str[j]] != 0 {
index = j
break
}
// 没有重复字符,在map中记录
set[str[j]] = 1
}
// 如果一直没有出现重复,说明遍历到了字符串尾端
if index == 0 {
index = size
}
// 比较最长子串长度,获取最长子串
length := index - i
if length > maxLength {
maxLength = length
maxStr = str[i:index]
}
// 清空记录字符的map,这里比较暴力,重新申请空间了
set = make(map[byte]int32, 0)
// 当剩余子串长度小于最长子串长度,没有遍历下去的必要了,提升效率
if maxLength >= (size - i) {
break
}
}
fmt.Println(maxLength, maxStr)
}