前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法练习之寻找不重复最长字符串

算法练习之寻找不重复最长字符串

作者头像
陌无崖
发布2019-08-21 17:58:08
1.6K0
发布2019-08-21 17:58:08
举报

不忘初心,砥砺前行

作者 | 陌无崖

转载请联系授权

题目

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一问一答

遍历字符串找不同可以先排序吗

不可以,在题目的要求下,无重复的最长子串必须是连续的在原来的字符串顺序保持不变的情况下

如何判断字符串中不重复

利用Golang中strings包的Contain函数判断,原序列是否包含子序列

假设

假设字符串长度为0

返回值应该为0

假设字符串长度为1

返回值为1

假设字符串长度为2

需要将第2个字符和第一个字符作比较,是否重复,如果重复,最长的长度为1不变,如果不重复,最长的长度需要进行+1

假设字符串为3

如果前两个字符不同,但包含了第3个字符,则返回2,否则返回3 如果前两个字符相同,但不包含第三个字符,则返回2,否则返回1

假设………………

不知道你有没有找到规律,对于一对长的字符串,我们可以假定最长长度max为1,即是第一个字符,然后找第二个字符,如果不相同,则max+1……以此类推,每次遍历一个字符,需要和前面的字符串进行比较,然后让max持续+1,如果遇到相同的,说明从的第一个字符到当前已经找到了当前的最大值,此时应该从第二个字符往后一直找不同,如果在找的过程中发现组合的字符串长度大于了max,此时应该让max等于当前字符串的长度。为了可以让字符可以找到下次应该循环的位置,因此需要定义一个移动的指针。

代码思路

1、判断字符串长度是否为0,如果为0直接返回0 2、假设max为1,result(含有最长长度的字符串)对应第一个字符,指针指向第一个字符 3、遍历字符串 4、result进行追加下一个字符 5、判断该result的最后一个字符,是否与前面的字符串重复, 6、如果不重复,判断max是否小于当前的result,如果小于,进行重新赋值max长度为len(result) 7、如果重复,指针指向下一个字符,result等于该字符,进行重新寻找连续的不重复的字符串

代码实现

代码语言:javascript
复制
package main

import (
    "fmt"
    "strings"
)

func Same(s string) bool {
    if strings.Contains(s[:len(s)-1], s[len(s)-1:]) {
        return true
    }
    return false
}

func lengthOfLongestSubstring(s string) int {
    if len(s) == 0 {
        return 0
    }
    // 定义一个字符串数组存放结果
    result := s[:1]
    max := len(result)
    l := 0
    for i := 1; i < len(s); i++ {
        result += string(s[i])
        if Same(result) {
            l++
            i = l
            result = string(s[i])
        } else {
            if max < len(result) {
                max = len(result)
            }
        }
    }
    return max
}

func main() {
    fmt.Println(lengthOfLongestSubstring(""))
    fmt.Println(lengthOfLongestSubstring("asdgfdsg"))
}

END

今日推荐阅读

RabbitMQ系列笔记广播模式和路由模式 RabbitMQ系列笔记入门篇

RabbitMQ系列笔记work模式

RabbitMQ系列笔记work模式

protoc语法详解及结合grpc定义服务

Golang中Model的使用

基于Nginx和Consul构建高可用及自动发现的Docker服务架构

▼关注我,一起成长

主要分享 学习心得、笔记、随笔▼

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang技术杂文 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 一问一答
  • 假设
  • 代码思路
  • 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档