示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
代码:
package main
import (
"fmt"
"regexp"
"sort"
)
func main() {
allStr := "abcabcbb"
//allStr := "bbbbb"
//allStr := "pwwkew"
//查找每一个字母开头,字母不重复最长的子串
result := []string{}
for i := 0; i < len(allStr); i++ {
for n := i + 1; n < len(allStr)+1; n++ {
lastSubStr := allStr[n-1 : n]
preSubStr := allStr[i : n-1]
fmt.Println(lastSubStr, preSubStr, i, n)
if findstr(lastSubStr, preSubStr) == true {
result = append(result, preSubStr)
fmt.Println(result)
break
}
if n == len(allStr) {
result = append(result, preSubStr+lastSubStr)
fmt.Println(result)
}
}
}
//在结果中查找最长的字符串
fmt.Println(Resort1(result))
}
// 查找字符子串是否在字符串(重复字符或字符串),找到则返回true,没有找到则返回false
func findstr(subStr, allStr string) bool {
re := regexp.MustCompile(subStr)
result := re.FindString(allStr)
if len(result) > 0 {
return true
} else {
return false
}
}
// 对子串长度进行重新排序,例如:"9/3"与"9/3*3"
// expr := []string{"12*4*9*3", "4/2/2", "8/4", "9/3", "5*5*4/4/5*5", "9/3*3"}
func Resort1(expr []string) []string {
type strStruct struct {
index int
strlen int
}
var strlens []strStruct
for i := 0; i < len(expr); i++ {
strlens = append(strlens, strStruct{i, len(expr[i])})
}
//对各个表达式的计算长度进行排序
sort.SliceStable(strlens, func(i, j int) bool {
return strlens[i].strlen < strlens[j].strlen
})
var Nums []string
for i := len(strlens) - 1; i >= 0; i-- {
Nums = append(Nums, expr[strlens[i].index])
}
return Nums
}