leetcode3:无重复字符的最长子串

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuweiyuxiang/article/details/83143181

1 题目

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

示例 1:

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

示例 2:

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

示例 3:

输入: “pwwkew”
输出: 3
解释: 无重复字符的最长子串是 “wke”,其长度为 3。
请注意,答案必须是一个子串,“pwke” 是一个子序列 而不是子串。

题目链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

2 解法

2.1 暴力求解法

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int maxlength = 0;
        for(int i = 0;i < s.size();i++){
            string sub(1,s[i]);
            for (int j = i+1; j < s.size();j++){
                if(sub.find(s[j]) == string::npos){
                    sub.append(1,s[j]);
                }else{
                    break;
                }
            }
            if(sub.size() > maxlength){
                maxlength = sub.size();
            }
        }
        return maxlength;
    }
};

2.2 滑动窗口法

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        //滑动窗口的方法
        int start=0;
        int end = 0;
        int maxlength = 0;
        string sub;
        for(; end < s.size() && start < s.size(); ){
            if(sub.find(s[end]) == string::npos){
                //cout<<"if:"<<end<<endl;
                sub.append(1,s[end]);
                end++;
                if(end - start > maxlength){
                    maxlength = end - start;
                }
            }else{
                //cout<<"else:"<<sub.size()<<endl;
                //cout<<"sub:"<<sub<<endl;
                sub = sub.erase(0,1);
                start++;
            }
        }
        return maxlength;
    }
};

2.3 优化的滑动窗口法

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        //优化的滑动窗口的方法
        int start=0;
        int end = 0;
        int maxlength = 0;
        string sub;
        int loc;
        for(; end < s.size() && start < s.size(); ){
            loc = sub.find(s[end]);
            if(loc == string::npos){
                //cout<<"if:"<<end<<endl;
                sub.append(1,s[end]);
                end++;
                if(end - start > maxlength){
                    maxlength = end - start;
                }
            }else{
                //cout<<"else:"<<sub.size()<<endl;
                //cout<<"sub:"<<sub<<endl;
                sub = sub.erase(0,loc+1);
                start = start + loc+1;
            }
        }
        return maxlength;
    }
};

心得: string类型的相关操作函数不是很熟练,需要加强。

猜你喜欢

转载自blog.csdn.net/liuweiyuxiang/article/details/83143181