3. 无重复字符的最长子串

时间:2024-01-22 19:11:15

示例 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

}