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;
    }
};
我们下期见!

猜你喜欢

转载自blog.csdn.net/miss_yuki/article/details/80808046