题目:

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

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

示例 1:

输入: "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

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

输入: "pwwkew"

输出: 3

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

 解题:

方法一:利用vector容器
执行用时 :20 ms, 在所有 cpp 提交中击败了66.62%的用户
内存消耗 :9.6 MB, 在所有 cpp 提交中击败了85.78%的用户
方法二:双指针滑动
执行用时 :4 ms, 在所有 cpp 提交中击败了99.47%的用户
内存消耗 :9 MB, 在所有 cpp 提交中击败了95.92%的用户

方法一
对每一个传入字符串的字符与vector中的所有内容进行比较,无重复则将字符存入vector末尾,有重复则先更新不重复字符串最大值mlen,再将vector中的重复字符即其之前的内容删掉,返回mlen。

vector的erase函数删除向量中[first,last)中元素:iterator erase(iterator first,iterator last)。注意参数是iterator类型,不能用数值。应使用vector的一个函数:iterator begin()。返回向量头指针,指向第一个元素。

vector的相关内容可参考:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html

class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.length();
vector<char>str;
int mlen=;
//扫描string s
for(int i=;i<n;i++){
char c = s[i];
//扫描vector str
for(int m=str.size()-;m>=;m--){
if(c==str[m]){
//更新mlen
if(mlen<str.size())
mlen = str.
//删除重复字符及其之前的字符。用vector的begin()函数控制删除区间
str.erase(str.begin(),str.begin()+m+);
break;
}
}
str.push_back(c);
}
if(mlen<str.size())
mlen=str.size();
return mlen;
}
};

方法二
在s的字符数量大于等于2个的时候,用头指针、尾指针指针分别指向s的开头和其开头+1,扫描两指针之间的字符并与尾指针进行对比,根据对比情况移动指针。
这期间只有两种情况,1:范围[头,尾)之间有跟尾字符重复的字符;2:没有。
遇到情况1时,更新最大长度mlen,头指针指向重复字符的后一位置,尾指针后移一位,继续扫描对比。
遇到情况2时,头指针不动,尾指针后移,继续。

class Solution {
public:
int lengthOfLongestSubstring(string s) {
int length=s.length();
//字符串长度为0、1时直接返回数字,双指针没有地方指。
if(!length)
return ;
if(length==)
return ;
//头指针p,最大长度mlen至少为1。
int p=,mlen=;
//尾指针end
for(int end=;end<length;end++){
for(int aim=p;aim<end;aim++){
//情况1
if(s[aim]==s[end]){
//更新头指针p
p=aim+;
//更新最大长度mlen
if(mlen<(end-aim))
mlen=end-aim;
break;
}
}
//情况2。要算上尾指针所以+1。
if(mlen<end-p+)
mlen=end-p+;
}
return mlen;
}
};

C++双指针滑动和利用Vector实现无重复字符的最长子串—力扣算法的更多相关文章

  1. 【LeetCode】无重复字符的最长子串【滑动窗口法】

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...

  2. 无重复字符的最长子串[双指针+哈希表] LeetCode.3

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  3. LeetCode 第 3 题:无重复字符的最长子串(滑动窗口)

    LeetCode 第 3 题:无重复字符的最长子串 (滑动窗口) 方法:滑动窗口 滑动窗口模板问题:右指针先走,满足了一定条件以后,左指针向前走,直到不满足条件. 特点:左右指针的方向是一致的,并且是 ...

  4. [LeetCode]3. 无重复字符的最长子串(滑动窗口)

    题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...

  5. Leetcode(三)无重复字符的最长子串

    3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...

  6. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  7. [LeetCode] 3. 无重复字符的最长子串

    题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...

  8. day4——无重复字符的最长子串

    // 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第2题 今日算法 题干 //给定一个字符串,请你找出其中不含有重复字符的 最长子串 ...

  9. leetcode 刷题(3)--- 无重复字符的最长子串

    给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...

随机推荐

  1. SSO单点登录思路

    SSO (Single Sign On) 什么是单点登录: 在大型的互联网公司中会有多个系统, 多个项目, 虽然这些项目都属于同一家公司, 但是项目本身其实都是独立的, 那多个系统可不可以实现共享同一 ...

  2. 第三章 学习Shader所需的数学基础(3)

    @[TOC] 1. 顶点的坐标空间变换过程 我们知道,在渲染流水线中,一个顶点要经过多个坐标空间的变换才能最终被画在屏幕上.一个顶点最开始是在模型空间中定义的,它最后会被变换到屏幕空间中,得到真正的屏 ...

  3. Java 基于Spire.Cloud.Excel 将Excel转为PDF

    Spire.Cloud.Excel Sdk 提供GeneralApi接口和WorkbookApi接口,支持将本地Excel和云端Excel文档转换为ODS, PDF, XPS, PCL, PS等格式. ...

  4. RestTemplate常用的get和post带参数请求

    在RestTemplate提供的方法中,有一个参数就是目标URL,参数是跟在后面的一个数量可变参数,但是在这里就有个问题,这个方法怎么知道我传的参数值是对应在目标接口的哪个参数的呢: public & ...

  5. 浏览器url访问tomcat出现错误 java.lang.NoSuchMethodError解决方法

    一般该类错误: 找不到方法或找不到类, 都是maven pom 仓库依赖的问题,有时是 因为缺少该依赖类,可以考虑添加相关依赖: 有时因为依赖冲突, 可以到 maven 的仓库下面把 有关该类的包 全 ...

  6. [TimLinux] Python 使用入门

    1. 为什么用Python 软件质量:Python注重可读性.一致性和软件质量. 提高开发者的效率:Python代码的大小往只有C++/Java代码的1/5 ~ 1/3. 程序的可移植性:绝大多数Py ...

  7. 2018 ACM-ICPC南京区域赛题解

    解题过程 开场开A,A题shl看错题意,被制止.然后开始手推A,此时byf看错E题题意,开始上机.推出A的规律后,shl看了E题,发现题意读错.写完A题,忘记判断N=0的情况,WA+1.过了A后,sh ...

  8. ARTS-S 在docker中运行本地脚本

    很多情况是本地没有编译环境,但docker中有编译环境.想编译本地代码,就要把本地的代码和编译脚本映射到docker中,脚本如下: docker run \ -it \ -v /Users/usern ...

  9. .net core 如何正确的读取body中的内容

    private string BodyToJson() { var reader = new StreamReader(Request.Body); var contentFromBody = rea ...

  10. Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?

    Spring Boot 打成的 jar 和普通的 jar 有什么区别 ? Spring Boot 打成的 jar Spring Boot的项目终止以jar包的形式进行打包,这种jar包可以通过可以通过 ...