剑指 Offer 48. 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
===============================================================
首先我想到的方法是滑动窗口,这个题目我好像刷到过,但是不是剑指offer的,滑动窗口更好理解,有一个不确定的点就是string中find方法的复杂度,可以换成hash
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left = 0;
        int right = 0;
        int num = 0;
        int sum = 0;
        for (int i = 0; i < s.size()&&right<s.size(); i++) {
            if (s.find(s[i],left) < i) {
                left = s.find(s[i], left)+1;
                if (num > sum)
                    sum = num;
                num = right-left;
            }
            right++;
            num++;
        }
        return num>sum?num:sum;
    }
};

看题解才明白用动态规划该如何做,动态规划的做法如下

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector<int> v;
        int left = 0;
        for (int i = 0; i < s.size(); i++) {
            if (s.find(s[i], left) < i) {
                left = s.find(s[i], left)+1;
            }
            v.push_back(i - left + 1);
        }
        int num = 0;
        for(int a: v){
            if (num < a)
                num = a;
        }
        return num;
    }
};

 

posted on 2022-02-17 15:08  4小旧  阅读(22)  评论(0)    收藏  举报

导航