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

示例 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. mysql 语句学习一 关于系统信息的查询

    首先说一下,SQL语句是不区分大小写的. 1.SELECT VERSION();           -- 查询当前版本号 2.SELECT CURRENT_TIME(); -- 查询当前时间 3.S ...

  2. document.write()重写问题

    document.write(); 可用于重写给某个元素追加内容; 当document.write(); 用于JS文件中,会重写整个页面,解决这个问题有多种方法. 重写原因:当onload的时候执行 ...

  3. stark——快速过滤list_filter

    一.获取过滤字段 1.给自定义配置类配置list_filter app01/stark.py: class BookConfig(ModelStark): list_display = [" ...

  4. 提交自己的包到 npm 中

    npm npm全称Node Package Manager,是node.js的模块依赖管理工具.使用github管理NPM包的代码,并定期提交至NPM服务器:npm官网 提交自己开发的NPM包 创建p ...

  5. selenium(2.4.0)中不能导出web drive 代码

    最近在学习selenium.要做web自动化测试.咱只会C# .就想了,这个测试用例要是能用C# 控制,保存起来,就可以以后自动运行了,不用每次点击运行了. 看了看它的文档,就开始试验了,录脚本折腾了 ...

  6. Mantis查看问题列表的列名修改_"P","#"两列

    在使用mantis的时候,点击菜单上的“查看问题”进去,就会罗列出当前的bug列表,可是列表的标题上存在着“P”和“#”的显示,个人觉得这两列在这里完全没有意义,或者说现有的显示使人觉得疑惑,究竟代表 ...

  7. SQL Server 的 主键 解决方案 NEWID() , 自增ID

    在 SQL Server 表的主键有自增Id ,和  GUID. 1.  自增Id 优点:索引空间小,索引连续.在大量数据插入的时候性能有特别大的优势. 缺点:可移植性差,在数据迁移的时候. 2. G ...

  8. Struts2的学习-通配符和session对象

    一. 取得session 3种方法1.context.getSession() -->>Map对象 2.HttpServletRequest request =(HttpServletRe ...

  9. JSP中include动作与指令

    include指令 JSP中有三大指令:page,include,taglib,之前已经说过了page的用法.这里介绍下include. 使用语法如下: <%@ include file=&qu ...

  10. 使用错误的操作系统用户exp数据导致ORA-15186错误

    生产环境alert日志中出现如下错误:Fri Dec 30 14:28:28 2016Errors in file XXXXXX.trc:ORA-15186: ASMLIB error functio ...