leetcode算法题—golang—无重复的字符的最长子串(题3)

题目:无重复的字符的最长子串

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例 1:

输入: "abcabcbb"
输出: 3
解释: 无重复字符的最长子串是 "abc",其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 无重复字符的最长子串是 "b",其长度为 1。
示例 3:

输入: "pwwkew"
输出: 3
解释: 无重复字符的最长子串是 "wke",其长度为 3。
     请注意,答案必须是一个子串,"pwke" 是一个子序列 而不是子串。

方法一

//abcabcbb
//判断子串是否合法
//内嵌一个循环判断是否有重复子串
//如果有个重复子串,则start和end的位置增加
//如果不重复则,继续增加子串的数量
func lengthOfLongestSubstring(s string) int {
	if s == ""{
		return 0
	}
	var strLen = len(s)
	var start,end=0,1
	var s2 string
	for end <= strLen{
		var s1 string = string(s[start:end])
		//计算重复
		var repeatCount int = 1
		var s1Len int = len(s1)
		for i:=0;i < s1Len;i++{
			var temp string = string(s1[i])
			repeatCount = strings.Count(s1,temp)
			//说明有重复的了
			if repeatCount >1{
				start++
				end =start+len(s1)
				break
			}
		}
		if repeatCount ==1{
			//增加
			s2 = s1 //保存之前的值
			end++
		}
	}
	return len(s2)
}

方法二

//n*n*n  找出该串的所有子串,不重复,且最大即可
func lengthOfLongestSubstring(s string)int{
	var counts int = 0
	for i:=0;i end-1位置的下标
	s = s[start:end]
	for i:=0;i

方法三

//利用滑动窗口和容器
func lengthOfLongestSubstring(s string)int{
	//借助一个容器,来判断,子串中是否有重复 妙
	m := make(map[byte]byte)
	sLen := len(s)
	start,end := 0,0
	var repeatCount int = 0
	//start 和 end 双条件判断,只有end一个也可以,可能这样更严谨一些吧
	for  start 

方法四

//优化滑动窗口
// abcabcbb
// abc
// bca
// cab
// abc
// cb
// b
func lengthOfLongestSubstring4(s string)int{
	var n,ans = len(s),0
	m := make(map[string]int) //存放字符出现的位置
	for j,i :=0,0; j

推荐是  方法三、方法四

 

你可能感兴趣的:(leetcode)