题目:
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
解题(错题报告):
总之我还是仍需努力,脑袋里的想法比较简单而且局限
好吧,就是没做出来,接下来是错题报告!!
分析:https://blog.csdn.net/qq_32805671/article/details/79902329
首先讲一下第一个简单的解题思路:
1.做循环,每一次指定一个子字符串结尾,如下:
第一次循环:abcabcbb
第二次循环:abcabcbb
第三次循环:abcabcbb
第四次循环:abcabcbb
...
最后一次循环:abcabcbb
每一次循环都指定了一个子字符串
2.在指定了子字符串后,再循环找出每个子字符串中不重复的最长子串:
- 如果是在字符结尾处才重复,则num就是直接加1,计算不重复次数;
- 如果不是在字符处结尾,则要用字符结尾减去重复字符出现的位置值,并在下一次循环中剔除他之前的字符,以防止再重复;
第一次循环:abcabcbb:a=a->num=1
第二次循环:abcabcbb
1. ab:a!=b
2. ab:b=b->num=2第三次循环:abcabcbb
1.abc:a!=c
2.abc:b!=c
3.abc:c=c->num=3
第四次循环:abcabcbb
1.abca:a=a->num=结尾-重复处=3;不是不重复子字符串,下一次循环剔除这之前的字符,因为到这里一定跟后面重复
第五次循环:abcabcbb
1.bcab:b=b->num=结尾-重复处=3;不是不重复子字符串,下一次循环剔除这之前的字符,因为到这里一定跟后面重复
第六次循环:abcabcbb
1.cabc:c=c->num=结尾-重复处=3;不是不重复子字符串,下一次循环剔除这之前的字符,因为到这里一定跟后面重复
第七次循环:abcabcbb
1.abcb:a!=b->
2.abcb:b=b->num=结尾-重复处=2
第八次循环:abcabcbb
1.cbb:c!=b->
2.cbb:b=b->num=结尾-重复处=1
3.比较每个子字符串中得到的最大长度,取其中的最大值。
max(1,2,3,3,3,3,2,1)=3
代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int max = 0;
int tmp = 0;
int l, r, i;
int N = s.size();
for (l = 0, r = 0; r <= N; r++) {
for (i = l; i <= r; i++) {
if (s[i] == s[r]) {
if (tmp > max) max = tmp;
break;
}
}
if (i == r) tmp++;
else {
l = i + 1;tmp = r - i;
}
}
return max;
}
};