LeetCode刷题——无重复字符的最长子串(beat 80%)

大家好,穿插刷题日记,继续leetcode,中等难度,字符串。题目要求如下:

思路:

构建一个字符串t用来保存子串,但这个t是不管是否有相同字符只写入不删除的,t会越来越长直到变成完整的字符串s,因此我们定义一个point表示当前不重复子串的起头位置,每当读入s的一个新的字符,我们就判断其与point和t的最后一个字符之间的字符是否相等。第二点是构造一个vector temp来计算每一个不重复的子字符串的长度。

为什么t只写入不删除呢,每次都clean然后从头作比较不是很方便么,但是不删除而是用point记录当前比较子串的起头位置是因为新读入的s的字符串可能与当前子串中的某一字符相同,我们就要从相同的这个字符的后一个字符开始重新计算下一个子串,因此这个相同点的位置总归是要记录的,如果把t的前面删除,point就会一会加一会减,很乱,不如不删除,可以保证point是持续增加的。

最后用max_element函数计算出vector中最大的元素输出即可。

代码如下:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.empty()){
            return 0;
        }
        vector<int> temp;
        string t;
        t += s[0];
        temp.push_back(1);
        int num = 0;
        int point = 0;
        int flag = 0;
        int len = s.size();
        for(int i = 1;i < len;i++){
            int len_str = t.size();
            for(int j = point;j < len_str;j++){
                if(s[i] == s[j]){
                    flag = 1;
                    point = j;
                    break;
                }
            }
            if(flag){
                t += s[i];
                int len_temp = len_str - point;
                point++;
                temp.push_back(len_temp);
                num++;
                flag = 0;
            }
            else{
                temp[num]++;
                t += s[i];
            }
        }
        auto result = max_element(temp.begin(), temp.end());
        return *result;
    }
};
我们下期见!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值