首页 > 其他分享 >3. 无重复字符的最长子串 Golang实现

3. 无重复字符的最长子串 Golang实现

时间:2024-09-23 16:50:12浏览次数:1  
标签:子串 字符 right 重复 Golang maxLength left

题目描述

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。
注意区分子串和子序列。

示例 3:

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

思路分析:
1.输入:字符串
2.目标:最长子串
3.困难: 会有重复的字符,这会导致子串无效,同时需要继续向后搜索。 滑动窗口就很适合这个问题。 重点是如何知道当前的字符是否出现过,有两个解决办法:1.使用一个数组来记录各个字符的频率,因为都是英文字符,那么就是ASCII码的范围,0-127.2.使用一个哈希表来记录

解法一(滑动窗口+数组记录频率):

点击查看代码
func lengthOfLongestSubstring(s string) int {
	if len(s) == 0 {
		return 0
	}
	left, right := 0, 0
	var freq [127]int
	result := 0

	for right < len(s) {
		if freq[s[right]] == 0 { // 如果右侧字符未出现
			freq[s[right]]++
			right++
		} else { // 否则,移动左指针
			freq[s[left]]--
			left++
		}
		result = max(result, right-left) // 更新最大子串长度
	}
	return result
}

解法二(滑动窗口+哈希表):

点击查看代码
func lengthOfLongestSubstring(s string) int {
	if len(s) == 0 {
		return 0
	}

	charIndexMap := make(map[byte]int)  // 哈希表存储字符的最新出现位置
	maxLength := 0
	left := 0  // 滑动窗口左边界

	for right := 0; right < len(s); right++ {
		// 如果当前字符在哈希表中存在,并且它的索引大于等于左边界,说明它重复了
		if idx, found := charIndexMap[s[right]]; found && idx >= left {
			left = idx + 1  // 将左边界移动到重复字符的下一个位置
		}

		// 更新当前字符的最新出现位置
		charIndexMap[s[right]] = right

		// 计算窗口的长度并更新最大长度
		maxLength = max(maxLength, right-left+1)
	}

	return maxLength
}

标签:子串,字符,right,重复,Golang,maxLength,left
From: https://www.cnblogs.com/CharlseGo/p/18427331

相关文章

  • [oeasy]python035_根据序号得到字符_chr函数_字符_character_
    字符(character)回忆上次内容上次了解了ord函数ord的意思是ordinal(序号)ord函数可以根据字符得到序号那么可以反过来吗?根据序号得到字符可以吗?......
  • 【CTF Web】BUUCTF SQLi-LABS Page-1(Basic Challenges) Less-6 Writeup(SQL注入+GET请
    sqli-labs1点击启动靶机。SQLi-LABSPage-1(BasicChallenges)原理双注入模板:selectcount(*),concat(([payload]),floor(rand(0)*2))asafrom[table_name]groupbya解法发送GET请求,id作为参数。http://b3f804a6-9ba6-418d-ac25-bf8d48589b62.node5.......
  • 字符串比较函数的编写(自己编写一个strcmp函数)
    //17.字符串比较函数的编写\nintdemo2(charstr1[],charstr2[]){ while((*str1++==*str2++)&&*str1&&*str2){//不等长则跳出时指向当前不相等位(++后有一位为空),等长不一样则跳出时指向不相等的下一位 // printf("%c%c\n",*str1,*str2); } if((*str2==*str1)&&(*......
  • c++中字符/串->整数
    char字符->整数数字:std::isdigit用于判断某个字符是否为数字(0-9)。字符串->数字:std::stoi用于将字符转换为整数。intisdigit(intch);//std::isdigit接受的参数类型为int,通常会传递字符类型(char)作为参数,但是字符会自动转换为对应的int值。intstoi(conststd::string&......
  • P6292 区间本质不同子串个数
    Solution与“区间本质不同回文子串个数”类似,但没有等差数列那样优美的性质了……下面是一个更通用的做法。考虑移动一次右端点\(r\),就相当于把parent树上一条到根链的lastendpos设为\(r\).把这个看成access操作.考虑用LCT维护parent树的链,维护一个性质:一条实链......
  • H7.1.4.1. 最短不公共子串
    Statement给两个串\(A,B\),其中\(|A|,|B|\le2000\),计算:\(A\)的最短子串,他不是\(B\)的子串\(A\)的最短子串,他不是\(B\)的子序列\(A\)的最短子序列,他不是\(B\)的子串\(A\)的最短子序列,他不是\(B\)的子序列Solution子序列自动机:\(\delta(u,c)=\min\{i|i>u\land......
  • 最长公共子串 题解
    StatementQ7.1.2.4,时限4s给一个串,定义\(\mathrm{LCS}\)为最长公共子串长度,\(q\)次询问,每次给出\(l,r\),求\[\operatorname{xor}_{i=1}^{r-l+1}\{i+\mathrm{LCS}(S[l,l+i-1],S[l+i-1,r])\}\]\(n\le10^5,q\le30\)Solutiontag:SA,线段树维护分治结构,orzhunction题目就是......
  • Linux 中实现文本中所有的单词的第一个字符大写,其余字符小写
     001、[root@PC1test]#lsa.txt[root@PC1test]#cata.txt##测试数据afdfeDETFDSSFFdefexkmxnd[root@PC1test]#cata.txt|awk'{for(i=1;i<=NF;i++){$i=toupper......
  • golang 项目引入私有仓库包
    场景:当你多个项目,都需要使用一个或者多个方法,那么可以将公共方法,抽成一个包,进行管理(类似Log模块等)。这时候可以将你的包上传到私有的仓库,其他项目引入该包即可。下面来介绍下,如何引用私有仓库的包。1. 创建一个新的Git标签假设你已经在你的私有GitLab仓库目录中,并且你已经......
  • 【day08-异常、File、字符集】
    异常什么是异常异常就是代表程序中出现的问题异常的分类编译时异常继承关系:继承自Exception,并非RuntimeException特点:编译时报错,在运行时报错运行时异常继承关系:继承自RuntimeException特点:编译时不报错,在运行时报错异常的作用作用一:异常是寻找程序bug的关键参......