补题报告——无重复字符的最长子串

题目:无重复字符的最长子串。

错误原因:几乎没有读懂,导致本题没有做对,另外初次见到这种题形,将它想得过于复杂,导致没有做对,另外在做题过程中也发现了一些问题,其中最主要的还是前面的string类字符串的知识掌握得不够熟悉,导致在取子串和取长度的时候耽误了好长时间。

题目:

无重复字符的最长子串

时间限制:1秒        内存限制:128M

题目描述
给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度
输入描述
输入一个字符串s
输出描述
不含重复字符的最长子串的长度
样例输入

abcabcbb

样例输出

3

样例解释
因为无重复字符的最长子串是“abc”,所以长度为3
数据范围
字符串长度小于1e5

a

b

c

a

b

c

b

b

解题思路 :看到题目的时候,就直接把样例抄在纸上模拟了一遍,结果思维就被僵化在了这种最普通的样例上,就像这样:

然后呢,又看到要输入字符串类型的s,就直接写成了这样:

string  s;

cin>>s;

当时竟然连带不带空格什么的也没想到,就直接写了。

接着一想,既然要求字串长度,那么就好像要用到双指针,于是刷刷就从c++写下了这样一段代码:

for(int i=0;i

for(int j=0;j

}

}

这里虽然想到要用双指针中的竞速指针,可惜的是竟然用错了,后来才想起竞速指针应该这样用:

int flag[128],l,r,maxlen;

。。。。。

for(int i=l;i

if(s[i]==s[r]){

l=i+1;

flag[s[r]]--;

}

}

整个题目都存在的问题就是基础的想法都知道也都会,但错了,听老师讲的时候就觉得非常可惜,可是也是实在有点转不过弯来,特别是分析的那一部分,思维就僵化在了最普通的答案上,没想到一些特殊的样例,像这个:

b

b

a

b

c

a

b

c

(只需要把上一个样例倒过来就行,但我当时竟然太着急了,都没有想到)

这里是成功AC的代码:

#include

using namespace std;

int flag[128],l,r,maxlen;

int main() {

string s;

getline(cin,s);

while(r

flag[s[r]]++;

if(flag[s[r]]>1){

for(int i=l;i

if(s[i]==s[r]){

l=i+1;

flag[s[r]]--;

}

}

}

maxlen=max(maxlen,r-l+1);

r++;

}

cout<

return 0;

}

你可能感兴趣的:(算法,c++,数据结构)