leetcode-3、无重复字符的最长子串(c++)

leetcode-3、无重复字符的最长子串(c++)

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

示例1

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

示例2

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

示例3

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

整体思路:

1、定义两个变量temp,result。变量temp用来临时存储没有重复元素的子串,result用来存储当前最大长度且没有重复元素的子串。
2、遍历给定字符串s,如果s[i]在字符串temp中已存在,则删除temp中从下标0到s[i]重复元素区间的子串。再将s[i]添加到temp中。
3、如果s[i]在字符串temp中已存在,在删除temp中从下标0到s[i]重复元素区间的子串之前,先判断temp的长度是否比result大,如果是,则将temp的元素赋给result.
4、由于对应解可能在给定字符串s的尾部,返回值时返回temp、result中长度较长的变量。

代码:
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        string temp;
        string result;
        for (int i=0;iresult.size() ){
                    result.clear();
                    result+=temp;
                }
                temp.erase(0,temp.find(s[i])+1);     //  删除temp中从下标0到s[i]重复元素区间的子串
            }
            temp+=s[i];                                       //将s[i]添加到字符串temp中
        }
        return temp.size()>result.size()?temp.size():result.size();
    }
};

解题过程遇到的麻烦:

第一次:

一开始,我使用的返回值是result.size();

错误代码
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        string temp;
        string result;
        for (int i=0;iresult.size() ){
                    result.clear();
                    result+=temp;
                }
                temp.clear();     
            }
            temp+=s[i];                                       //将s[i]添加到字符串temp中
        }
      		return result.size();
      
    }
};

340 / 987 个通过测试用例
状态:解答错误
提交时间:几秒前
输入:
" "
输出:
0
预期:
1

改正后的代码:
  return temp.size()>result.size()?temp.size():result.size();
第二次:

一开始我判断到s[i]在字符串temp中已存在时,将整个temp清空

错误代码
if(temp.find(s[i]) != string::npos ) {         //如果s[i]在temp中已存在
                if(temp.size()>result.size() ){
                    result.clear();
                    result+=temp;
                }
                temp.clear();     //  删除temp中从下标0到s[i]重复元素
            }

407 / 987 个通过测试用例
状态:解答错误
提交时间:几秒前
输入:
“dvdf”
输出:
2
预期:
3

改正后的代码:

if(temp.find(s[i]) != string::npos ) {         //如果s[i]在temp中已存在
                if(temp.size()>result.size() ){
                    result.clear();
                    result+=temp;
                }
                temp.erase(0,temp.find(s[i])+1);     //  删除temp中从下标0到s[i]重复元素区间的子串。注意区间由一个半开区间[first,last) 来指定,所以temp.find(s[i])要+1。
            }

膜拜大佬题解代码

class Solution{
    public:
    int lengthOfLongestSubstring(string s){
        int maxlen=0, k=-1;
        vector vec(128,-1);
        for (int i=0;ik){
                k=vec[int(s[i])];
                vec[int(s[i])]=i;
            }
            else{                                                                              
                vec[int(s[i])]=i;
                maxlen=max(maxlen,i-k);
            }
        }
        return maxlen;
    }
};

执行结果:
通过
显示详情
执行用时:4 ms, 在所有 C++ 提交中击败了99.55% 的用户
内存消耗:7.8 MB, 在所有 C++ 提交中击败了68.28% 的用户

来源:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-cshi-xian-/

你可能感兴趣的:(leetcode算法,leetcode,算法,字符串)