第九周学习总结

这周前几天由于入党积极分子的两个两千字学习总结以及结业考试把我大部分空余时间都占了,因此本周学习时间较少,目前来说算是把双指针以及set,queue等函数搞懂了,剩下的内容我会在下周尽快补回来.

首先说一道题,就是输入一个字符串后,寻找字符串中不重复的最长字符串的长度.

示例1:

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

示例2:

输入: “bbbbb”

输出: 1

解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

 

示例3:

输入: “pwwkew”

输出: 3

解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。

 

先对这道题分析一下,要知道c++中共有128个字节,因此我们可以先创建一个长度为128的数组,然后把数组中的数全部定义为-1.

a[0]a[1]a[2]a[3]a[4]a[5]a[6]...
-1-1-1-1-1-1-1-1-1-1

 

输入的字符串的每一个字母都在这个数组中

startabcdcountlongest
0-1-1-1-100
00-1-1-110
001-1-120
0012-130
4412-113
4452-123
4456-133

 上图是对示例1的简单分析,就是刚开始每个字母都是-1,对这个输入的字符串遍历,从第一个字母开始,到出现重复的字母截止算为一个长度,然后把这个长度储存下来,再继续往后遍历,同样的道理,继续往后遍历,再保存长度,最后把最大的长度输出就ok了.

代码如下:


	int start=0,count=0,longest=0;
	int a[128];
	for(int i=0;i<=127;i++)
	a[i]=-1;
	for(int i=0;i<=s.length();i++){
		if(a[s[i]]<start){
			a[s[i]]=i;
			count++;
			
		}
		else
		{
			if(count>longest)
			longest = count;
			count=i-a[s[i]];
			start = a[s[i]]+1;
			a[s[i]]=i;
			
		}
	}
	if(count>longest)
	longest = count;
	return longest;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值