LeetCode 第三题:无重复字符的最长子串-- C++

题目:

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 "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.bcabb=b->num=结尾-重复处=3;不是不重复子字符串,下一次循环剔除这之前的字符,因为到这里一定跟后面重复

第六次循环:abcabcbb

    1.cabcc=c->num=结尾-重复处=3;不是不重复子字符串,下一次循环剔除这之前的字符,因为到这里一定跟后面重复

第七次循环:abcabcbb

    1.abcb:a!=b->

    2.abcb:b=b->num=结尾-重复处=2

第八次循环:abcabcbb

    1.cbbc!=b->

    2.cbbb=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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值