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

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

字符数组和字符串的区别,C语言字符数组和字符串区别详解

开始的想法是在对字符数组设置两个指针,初始化一个在位置0一个在位置1,ans初始化为1(非空),然后1向后找,0不动,取0到1之间的字符串,判断是否重复(这里单独写一个函数,输入字符串,输出是否重复以及重复字符的后一个的位置),不重复的话用后位置减去前位置,再和ans比较,大的话就保留。如果有重复则前位置向后移动一位,后位置在其后面一位,接着判断之间的字符串是否重复。

#include <iostream>
using namespace std; //判断是否有重复
bool re_or_not(string s)
{
int len= s.length();
for(int i=;i<len;i++){
for(int j=i+;j<len;j++){
if(s[i]==s[j]){
std::cout << " true" << std::endl;
return true;
}
}
}
std::cout << " false" << std::endl;
return false;
} int lengthOfLongestSubstring(string s) {
//char* p1=(char*)s.data();
//char* p1=&s[0];
//char* p2=p1+1;
int len=s.length();
//判空
if(len==)
return ;
int num=;
int begin=;
int end=begin+;
int n=;
while(s[end]!='\0'&&s[begin]!='\0'){
if(re_or_not(s.substr(begin,end-begin+))){
begin++;
end=begin+;
std::cout << " 此时begin="<<begin<< " 此时end="<<end<< std::endl;
}
else{
if(end-begin+>num)
num=end-begin+;
std::cout << " 此时begin="<<begin<< " 此时end="<<end<< std::endl;
end++;
}
}
return num;
} int main() {
string s="dewzyqprkqcmgfnrdfoflwsvkhylsfjxlhwlxne";
int n=lengthOfLongestSubstring(s);
std::cout << n << std::endl;
return ;
}

986 / 987 个通过测试用例
状态:超出时间限制

真的尴尬

再来:

优化,不用那个substring函数了

#include <iostream>
using namespace std; //判断是否有重复
bool re_or_not(string s,int begin,int end)
{
int len= begin-end+;
for(int i=begin;i<len;i++){
for(int j=i+;j<len;j++){
if(s[i]==s[j]){
std::cout << " true" << std::endl;
return true;
}
}
}
std::cout << " false" << std::endl;
return false;
} int lengthOfLongestSubstring(string s) {
//char* p1=(char*)s.data();
//char* p1=&s[0];
//char* p2=p1+1;
int len=s.length();
//判空
if(len==)
return ;
int num=;
int begin=;
int end=begin+;
int n=;
while(s[end]!='\0'&&s[begin]!='\0'){
if(re_or_not(s,begin,end)){
begin++;
end=begin+;
std::cout << " 此时begin="<<begin<< " 此时end="<<end<< std::endl;
}
else{
if(end-begin+>num)
num=end-begin+;
std::cout << " 此时begin="<<begin<< " 此时end="<<end<< std::endl;
end++;
}
}
return num;
} int main() {
string s="alqebriavxoo";
int n=lengthOfLongestSubstring(s);
std::cout << n << std::endl;
return ;
}

还是超时间;

再来:

因为所有字符只有256个,所以定义这样一个数组来判断重复就行了,同时,在遇到重复时,begin和end都后移一位

//判断是否有重复并输出位置
bool re_or_not(std::string s,int begin,int end)
{
int re[256]={0};
for(int i = begin; i<end+1; i++){
if(re[s[i]]==0){
re[s[i]]=1;
}
else return true;
}
return false;
}

int lengthOfLongestSubstring(string s) {
int len = s.length();
//判空
if (len == 0) return 0;
int num = 1;
int begin = 0;
int end = begin + 1;
int n = 0;
while (s[end] != '\0'&&s[begin] != '\0'){
if (re_or_not(s, begin, end)){
begin++;
end ++;
}
else{
if (end - begin + 1>num)
num = end - begin +1;
end++;
}
}
return num;
}

执行用时: 612 ms, 在Longest Substring Without Repeating Characters的C++提交中击败了0.98% 的用户
内存消耗: 332.3 MB, 在Longest Substring Without Repeating Characters的C++提交中击败了0.93% 的用户

这时间。。。。。,看来要大改了

还是上面的256的思路

#include <iostream>
#include <unordered_map> using namespace std; int lengthOfLongestSubstring(std::string s) {
int len=s.length();
//判空
if(len==)
return ;
int re[]={};
int num=;
int begin=;
for(int i=;i<len;i++)
{
if(re[s[i]]==||begin>re[s[i]])//不重复,所以要尝试更新num
//这里不仅要考虑对应位置的值为0,同时还要考虑这样的字符串”abbca“,按之前的方法,最后一个a被当作出现过处理了。但实际上这个a也要加入计算的,所以这里要再加上一个判断条件
//那就是如果此时begin>re[s[i]]的左边,也就是说就算重复了,但是新的a出现时,旧的a已经不再最长字符串的考虑范围内了(因为新字符串的begin位置已经在旧a的右边了)
{
if(num<i-begin+)
num=i-begin+;
}
else//重复了,所以要把begin的位置更新到re中对应的字符对应的位置
{
begin=re[s[i]];
}
re[s[i]]=i+;//+1是为了防止出错,因为i是从0开始的,后面的都要判断是否为0,所以要区别开
std::cout << " 此时i=" << i << " 此时num=" << num << std::endl;
}
return num;
} int main() {
std::string s="abbca";
int n=lengthOfLongestSubstring(s);
std::cout << n << std::endl;
return ;
}

执行用时: 32 ms, 在Longest Substring Without Repeating Characters的C++提交中击败了49.69% 的用户
内存消耗: 14.7 MB, 在Longest Substring Without Repeating Characters的C++提交中击败了0.93% 的用户

还可以吧

#leetcode刷题之路3-无重复字符的最长子串的更多相关文章

  1. leetcode刷题第三天<无重复字符的最长子串>

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

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

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

  3. leetcode刷题笔记-3. 无重复字符的最长子串(java实现)

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

  4. LeetCode随缘刷题之无重复字符的最长子串

    欢迎评论区交流. package leetcode.day_12_04; /** * 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度. * <p> * 示例1: * &l ...

  5. LeetCode刷题--无重复字符的最长子串(中等)

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

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

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

  7. python刷LeetCode:3.无重复字符的最长子串

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

  8. Leetcode题库——3.无重复字符的最长子串

    @author: ZZQ @software: PyCharm @file: lengthOfLongestSubstring.py @time: 2018/9/18 20:35 要求:给定一个字符串 ...

  9. LeetCode 第三题--无重复字符的最长子串

    1. 题目 2.题目分析与思路 3.思路 1. 题目 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3 ...

  10. 【LeetCode】Longest Substring Without Repeating Characters(无重复字符的最长子串)

    这道题是LeetCode里的第3道题. 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: ...

随机推荐

  1. 写一个安全的Java单例

    单例模式可能是我们平常工作中最常用的一种设计模式了.单例模式解决的问题也很常见,即如何创建一个唯一的对象.但想安全的创建它其实并不容易,还需要一些思考和对JVM的了解. 1.首先,课本上告诉我,单例这 ...

  2. MySQL8.0加载文件内容报错: ERROR 1148: The used command is not allowed with this MySQL version

    mysql数据库将文件内容加载到表中报错: mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet LINES TERMINAT ...

  3. 成长之路--Docker入门

    简介 Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机. Docker版本 Docker 划分为CE 和EE.CE 即社区版(免费,支持周期三个月),EE 即企业版,强调安全,付费使 ...

  4. Thrift笔记(二)--Thrift框架分层设计

    thrift架构设计使用了分层设计,类似TCP/IP分层,上次使用下层提供的服务.分层设计在计算机中是一个常用的设计,上层和下层定义好接口或者说协议,下层实现可以随意更换,只要实现好定义的接口和协议就 ...

  5. Vue表格中,对数据进行转换、处理

    众所周知,后端从Mysql取出的数据,一般是很难单独处理某一个Key的数据的(需要处理的话,可能会浪费大量的性能.而且对页面加载时间有很大的影响),所以,从数据库取出的数据.只能由前端进行处理.但是在 ...

  6. 【代码笔记】Java基础:Java的方法和类

    面向过程与面向对象都是我们编程中,编写程序的一种思维方式.例如:公司打扫卫生(擦玻璃.扫地.拖地.倒垃圾等), 按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,然后一件件的完成”,最后把公司卫生 ...

  7. ${pageContext.request.contextPath}是JSP取得绝对路径(转载)

    ${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%> . 也就是取出部署的应用程 ...

  8. Linux下利用script命令录制并回放终端会话

    Linux下利用script命令录制并回放终端会话 核心命令 script 和 scriptreplay 录制屏幕 script -t 2>timescript typescript 命令解释: ...

  9. spring配置连接池和dao使用jdbcTemplate

    1 spring配置c3p0连接池 第一步 导入jar包 第二步 创建spring配置文件,配置连接池 (1)把代码中的实现在配置文件中实现 2 dao使用jdbcTemplate (1) 创建ser ...

  10. Oracle的sql语句的两种判断形式

    Oracle的sql语句的两种判断形式 判断当前列同时改动当前列 判断一个情况改动其他值 一类情况详解:实现的是当num这一列的值为3时,就显示好 以此类推 1)case num when 3 the ...