这周前几天由于入党积极分子的两个两千字学习总结以及结业考试把我大部分空余时间都占了,因此本周学习时间较少,目前来说算是把双指针以及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 |
输入的字符串的每一个字母都在这个数组中
start | a | b | c | d | count | longest |
0 | -1 | -1 | -1 | -1 | 0 | 0 |
0 | 0 | -1 | -1 | -1 | 1 | 0 |
0 | 0 | 1 | -1 | -1 | 2 | 0 |
0 | 0 | 1 | 2 | -1 | 3 | 0 |
4 | 4 | 1 | 2 | -1 | 1 | 3 |
4 | 4 | 5 | 2 | -1 | 2 | 3 |
4 | 4 | 5 | 6 | -1 | 3 | 3 |
上图是对示例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;