Longest Substring Without Repeating Characters

本文介绍了一种求解字符串中最长无重复字符子串长度的高效算法。通过使用映射表记录字符索引,结合起始索引更新机制,实现了O(n)的时间复杂度。文章详细展示了算法流程及实例分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a string, find the length of the longest substring without repeating characters.
For example:
1.The longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3.
2.For "bbbbb" the longest substring is "b", with the length of 1.
算法主要用一个映射表记录现在已遍历到的字符,并将相应的索引记录下来。用一个起始索引变量记录字符串的开始索引位置,遇到重复字符(且该重复字符的索引值>=开始索引)时更新该索引,将其变为重复变量索引的后一位,并更新最大字符串长度。最后别忘了从开始索引到最后还没出现重复字符的情况。
startIndex:不包含重复字符的字符串开始索引,起始为0
maxLength:用于记录最长的非重复字符的字符串长度,起始为0
对于例1:主要信息随着遍历的改变情况如下

字符串

a

b

c

a

b

c

b

b

索引

0

1

2

3

4

5

6

7

a

0

0

0

3

3

3

3

3

b

 

1

1

1

4

4

6

7

c

 

 

2

2

2

5

5

5

startIndex

0

0

0

1

2

3

5

7

maxLength

0

0

0

3

3

3

3

3

class Solution {
public:
	int lengthOfLongestSubstring(string s) 
	{
		int maxLenght = 0;           //最长非重复字串长度
		int startIndex = 0;          //每次出现重复时更新开始索引
		map<char, int> record;       //用于记录字符出现索引的映射表
		for(int i=0;i<s.size();++i)
		{
			if (record.count(s[i])>0&&record[s[i]]>=startIndex) //存在字符记录且索引不比开始索引小
			{
				maxLenght = max(maxLenght,i-startIndex);
				startIndex =record[s[i]]+1;   //出现重复字符,将开始索引更新为重复字符的后一位
			}
			record[s[i]] = i;
		}
		maxLenght = max(maxLenght,(int)s.size()-startIndex);
		return maxLenght;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值