博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
无重复字符的最长子串(Go,LeetCode)
阅读量:4188 次
发布时间:2019-05-26

本文共 2330 字,大约阅读时间需要 7 分钟。

目录


 

题目描述

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

输入/输出示例:

输入 输出 解释
abcabcbb 3 因为无重复字符的最长子串是“abc”,所以其长度为3

 

 

解决方案

这个问题本质上是一个队列应用问题。我们依次将元素放入队列中,在入队列的时候检查要入队列的元素是否存在于队列中。如果存在,需要将队列中不断的弹出元素,直到把重复的该元素弹出,然后再将该元素入队列。此外,队列中需要有一个变量记录队列长度的最大值,在所有字符都完成过入队列操作后,将该记录返回。

 

代码 

package mainfunc lengthOfLongestSubstring(s string) int {	queue := CreateQueue()	for _, char := range s {		queue.Push(char)	}	return queue.MaxLength}type Queue struct {	Base		[]int32	base		map[int32]string	MaxLength	int}func CreateQueue() *Queue {	queue := new(Queue)	queue.base = make(map[int32]string)	return queue}func (q *Queue) Push(data int32) {	if q.Exist(data) {		q.Remove(data)	}	q.Base = append(q.Base, data)	q.base[data] = ""	if q.Length() > q.MaxLength {		q.MaxLength = q.Length()	}}func (q *Queue) Exist(data int32) bool {	_, ok := q.base[data]	return ok}func (q *Queue) Remove(data int32) {	for {		element := q.Pop()		if element == data {			break		}	}}func (q *Queue) Pop() int32 {	element := q.Base[0]	q.Base = q.Base[1:]	delete(q.base, element)	return element}func (q *Queue) Length() int {	return len(q.Base)}

 

代码走读

 

package mainimport "fmt"// 解决函数(LeetCode定义)func lengthOfLongestSubstring(s string) int {   queue := CreateQueue()   for _, char := range s {      queue.Push(char)   }   return queue.MaxLength}// 队列结构定义。数据存储在Base中,MaxLength表示最大长度记录type Queue struct {   Base      []int32   base      map[int32]string   MaxLength  int}// 队列初始化func CreateQueue() *Queue {   queue := new(Queue)   queue.base = make(map[int32]string)   return queue}// 往队列中放入一个元素。如果该元素存在,则将该元素和该元素之前的所有元素弹出队列,然后再将该元素放入队列func (q *Queue) Push(data int32) {   if q.Exist(data) {      q.Remove(data)   }   q.Base = append(q.Base, data)   q.base[data] = ""   // 判断长度是否超过了记录最大值   if q.Length() > q.MaxLength {      q.MaxLength = q.Length()   }}// 判断队列是否存在。base的意义在于查询比Base要快func (q *Queue) Exist(data int32) bool {   _, ok := q.base[data]   return ok}// 从队列中弹出指定的元素,弹出的同时也会将该元素之前的所有元素弹出func (q *Queue) Remove(data int32) {   for {      element := q.Pop()      if element == data {         break      }   }}// 从队列头弹出一个元素func (q *Queue) Pop() int32 {   element := q.Base[0]   q.Base = q.Base[1:]   delete(q.base, element)   return element}// 求队列长度func (q *Queue) Length() int {   return len(q.Base)}// 自测用例func main() {   result := lengthOfLongestSubstring("abcabcbb")   fmt.Println(result)}

 

传送门

转载地址:http://jdsoi.baihongyu.com/

你可能感兴趣的文章
使用Hadoop的MapReduce来完成大表join
查看>>
常用的算法
查看>>
Mina框架
查看>>
Spring MVC 和 Servlet 一样,都不是线程安全的
查看>>
Java线程:线程的同步与锁
查看>>
Mac、Windows可以互相远程
查看>>
oracle提示 ORA-12154: TNS: 无法解析指定的连接标识符
查看>>
oracle 插入数据时提示没有足够的值
查看>>
Oracle Net Manager的使用及配置
查看>>
镜像文件
查看>>
苹果笔记本桌面下面的工具栏没了怎么调出来
查看>>
CSS原理与CSS经验分享
查看>>
oracle中int与number的区别
查看>>
php不用jsonp也能跨域
查看>>
solr作为一种开源的搜索服务器
查看>>
Pig分析数据过程
查看>>
linux下文件夹的创建、复制、剪切、重命名、清空和删除命令
查看>>
pentaho套件
查看>>
软件产品经理职责
查看>>
Linux下Tomcat的安装配置
查看>>