需求

输入一个字符串,尝试编程找到其中最长的不包含重复字符的子字符串,并将其长度返回。例如,输入“aaa”,将返回1作为结果, 输入“abcabcbb”,将返回3作为结果。

思路

本题需要查找的是最长的不含重复字符的子串,首先可以先确定一个起始点,之后计算从此起始点向后截取可以得到的不含重复字符的最长子串的长度, 之后依次向后移动起始点,循环计算子串长度的操作,最终取长度最大的结果返回即可。核心思路可以总结如下:

  1. 以0为起点进行不含重复字符的最长子串的长度计算。
  2. 移动起点,再次进行不含重复字符的最长子串的长度计算。
  3. 重复过程2,直到起点移动到原字符串的最后一个字符位置为止。
  4. 将计算结果中的最大值返回。

实现

package chapter11

func maxL(start int, str string) (max int) {
    var hash = make(map[string]int)
    // 这里需要转换[]rune,否则直接用str切片(str[start:])会乱码
    runes := []rune(str)
    for i, s := range runes[start:] {
        if _, ok := hash[string(s)]; ok {
            return
        }
        hash[string(s)] = i
        max++
    }
    return
}

func lengthOfLongestSubstring(str string) (max int) {
    for i, _ := range str {
        length := maxL(i, str)
        if length > max {
            max = length
        }
    }
    return
}