C++双指针滑动和利用Vector实现无重复字符的最长子串—力扣算法
题目:
力扣原题链接: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实现无重复字符的最长子串—力扣算法的更多相关文章
- 【LeetCode】无重复字符的最长子串【滑动窗口法】
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...
- 无重复字符的最长子串[双指针+哈希表] LeetCode.3
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...
- LeetCode 第 3 题:无重复字符的最长子串(滑动窗口)
LeetCode 第 3 题:无重复字符的最长子串 (滑动窗口) 方法:滑动窗口 滑动窗口模板问题:右指针先走,满足了一定条件以后,左指针向前走,直到不满足条件. 特点:左右指针的方向是一致的,并且是 ...
- [LeetCode]3. 无重复字符的最长子串(滑动窗口)
题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...
- Leetcode(三)无重复字符的最长子串
3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...
- 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
- [LeetCode] 3. 无重复字符的最长子串
题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...
- day4——无重复字符的最长子串
// 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第2题 今日算法 题干 //给定一个字符串,请你找出其中不含有重复字符的 最长子串 ...
- leetcode 刷题(3)--- 无重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...
随机推荐
- Nginx 配置整理
链接:nginx配置详细解析 1. C10k问题:无法同时并发超过(1w)客户端请求而出现的问题. nginx默认配置超过1w并发: 2.配置文件conf/nginx.conf (1)user www ...
- NetScaler内网外网ip映射的配置
- PHP经典面试题目汇总
1.双引号和单引号的区别 双引号解释变量,单引号不解释变量 双引号里插入单引号,其中单引号里如果有变量的话,变量解释 双引号的变量名后面必须要有一个非数字.字母.下划线的特殊字符,或者用{}讲变量括起 ...
- 第二章 Unity Shader基础
[TOC] 1. Unity Shader 的基础: ShaderLab 学习和编写着色器的过程一直是一个学习曲线很陡峭的过程,通常情况下为了自定义渲染效果往往要和很多文件和设置打交道,这些设置很容易 ...
- 顺序表-C语言实现
顺序存储线性表的结构体: #define MAXSIZE 100 //数组最大长度 typedef int ElemType; //元素类型 typedef struct //定义线性表结构体 { E ...
- 转:OAuth2 深入介绍
OAuth2 深入介绍 1. 前言 2. OAuth2 角色 2.1 资源所有者(Resource Owner) 2.2 资源/授权服务器(Resource/Authorization Server) ...
- Java并发编程学习随笔 (一) 使用run() 和 start()的差别
java多线程run()和start()的区别 当你启动线程,使用start(),系统会把run()方法当成线程执行体来处理,这是正常的,也是正确的情况.但是,当你启动线程时,调用run()方法,系统 ...
- 《手把手教你》系列进阶篇之3-python+ selenium自动化测试 - python几种骚操作你都知道吗?(详细教程)
1. 简介 这篇文章主要是给小伙伴或者童鞋们介绍和分享 python几种骚操:读取配置文件.获取根目录的相对路径.获取系统时间和格式化时间显示.字符串切割等等操作.为后边的自动化框架打下一个结实的基础 ...
- [TimLinux] TCP全连接队列满
0. TCP三次握手 该图来自:TCP SOCKET中backlog参数的用途是什么? syns queue: 半连接队列 accept queue: 全连接队列 控制参数存放在文件:/proc/sy ...
- Codeforces-501b
Misha hacked the Codeforces site. Then he decided to let all the users change their handles. A user ...