1.自拟
//寻找最长不含有重复字符的子串package mainimport "fmt"func main() {var str = "abcdabcc"var ch = make(map[byte]int)var long intvar moreLong intvar longStr []bytevar moreLongStr []bytemoreLongStr = nilfor i := 0; i < len(str); i++ {longStr = nilfor j := i; j < len(str); j++ {if ch[str[j]] == 0 {ch[str[j]] = 1long++longStr = append(longStr, str[j])}else {if long > moreLong {moreLong = longmoreLongStr = longStr}break}}}fmt.Println(string(moreLongStr))}
2.优化版
package mainimport "fmt"func noRepeatStr(str string) (maxLength int,subStr string){start := 0lastOccurred := make(map[byte]int)for i, v := range []byte(str) {if lastI, ok := lastOccurred[v]; ok && lastI >= start {start = lastI + 1}if i-start+1 > maxLength{maxLength = i - start + 1subStr = str[start:i+1]}lastOccurred[v] = i}return}func main() {len, subStr := noRepeatStr("abcdacba")fmt.Printf("length:%d,str:%s", len, subStr)}
3.国际版
package mainimport "fmt"func noRepeatStr(str string) (maxLength int,subStr string){start := 0lastOccurred := make(map[rune]int)for i, v := range []rune(str) {if lastI, ok := lastOccurred[v]; ok && lastI >= start {start = lastI + 1}if i-start+1 > maxLength{maxLength = i - start + 1subStr = string([]rune(str)[start:i+1])}lastOccurred[v] = i}return}func main() {len, subStr := noRepeatStr("abcdacba")fmt.Printf("length:%d,str:%s\n", len, subStr)len, subStr = noRepeatStr("你好世界你好")fmt.Printf("length:%d,str:%s", len, subStr)}
