1. 获取最长不重复子串
例如abcda,最长子串为abcd
func maxSub(str string) string {
if len(str)<=1{
return str
}
for i := 0; i < len(str); i++ {
for j := 1; j < len(str); j++ {
if str[i] == str[j] {
fmt.Println("s:", str[:j])
return str[:j]
}
}
}
return ""
}
2. 查找子串的最长子串,要求子串字符不重复,返回最大的长度. 例如abcda,最长子串为abcd,长度为4
- 主要用到 滑动窗口 来进行解答。
- 滑动窗口是什么?
简单来说就是一个队列,比如对于字符串 abcabcbb,依次往队列中添加字符串中的每一个元素,当队列中有 abc 时,这时在进入 a,就不满足要求了。所以,要移动这个队列。
- 怎么移动?
只需去掉左边的相同元素之前的(包括相同元素)即可。
我们只需要用一个变量 maxNum 记录不重复的最长字串即可。
func lengthOfLongestSubstring1(s string) int {
if s == "" {
return 0
}
li := make([]byte, 1)
li[0] = s[0]
maxNum := 1
for i := 1; i < len(s); i++ {
for j := 0; j < len(li); j++ {
if s[i] == li[j] {
已存在相同元素
if maxNum < len(li) {
maxNum = len(li)
}
li = li[j+1:]
break
}
}
li = append(li, s[i])
if maxNum < len(li) {
maxNum = len(li)
}
}
return maxNum
}
3. 可分割的最长字符及最长字符的长度
func longestWord(s string) (string, int) {
best, length := "", 0
for _, word := range strings.Split(s, " ") {
if len(word) > length {
best, length = word, len(word)
}
}
return best, length
}
func main() {
args := "安倍12 Monday Tuesday Friday Sunday Wednesday Wednesday"
word, wlen := longestWord(args)
fmt.Printf("%q %d\n", word, wlen)
}
博客围绕获取最长不重复子串展开,以字符串“abcda”为例,说明要查找字符不重复的最长子串并返回其长度。主要运用滑动窗口方法解答,滑动窗口类似队列,当队列元素不满足要求时,去掉左边相同元素之前的部分,用变量记录最长不重复子串。
1万+

被折叠的 条评论
为什么被折叠?



