LeetCode 3_Longest Substring Without Repeating Characters

LeetCode 3_Longest Substring Without Repeating Characters

题目描写叙述:

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

也就是寻找字符串中的不含反复元素的最长子串的长度。

首先非常easy想到的是暴力法:外两层循环在字符串中不断的扫描子串,内两层循环用来推断子串是否是有反复字符。

显然这样的方法时间复杂度有点高为O(n^4)。基本上不能够被接受。

在上面的方法中。推断子串是否有反复的过程中能够不用用两层循环来扫描。能够使用哈希表的方法推断。代码例如以下:

<span style="font-size:18px;">class Solution {
public:int lengthOfLongestSubstring(string s) {int i,j;  int maxLength = 0;  int hash[256];  int n = s.size();for(i = 0; i < n; ++i){memset(hash,0,sizeof(hash));   hash[s[i]] = 1;  for(j=i+1; j<n; ++j)  {  if(hash[s[j]] == 0)  hash[s[j]] = 1;  else  break;  }  if(j-i > maxLength)  maxLength = j-i; }return maxLength;}
};</span>

上面的方法时间复杂度为O(n^2),以下给出LeetCode的參考答案,时间复杂的为O(n),并且代码很easy!真实不得不佩服大牛。。。

思路:使用i和j两个指针进行搜索,i代表候选的最长子串的开头。j代表候选的最长子串的结尾。

先如果i不动。右移j。直到j到达原字符串的结尾,此时j-i就构成了一个候选的最长子串。

每次都维护一max_length,就能够选出最长子串了。如果字符j已经反复出现过(如果在位置k),就须要停止右移了。

记录当前的候选子串并和max_length做比較。

以下就是一个非常好的处理,还真没想到。

在下一次搜寻中,i应该更新到k+1。这句话的意思是。用这个样例来理解。abcdef是个不反复的子串,abcdefc中(为了方便记录为abc1defc2),c1和c2反复了。那么下一次搜寻,应该跨过出现反复的地方进行,否则找出来的候选串依旧有反复字符,且长度还不如上次的搜索。所下面一次搜索。直接从c1的下一个字符d開始进行。也就是说,下一次搜寻中,i应该更新到k+1。

代码例如以下:

class Solution {
public:int lengthOfLongestSubstring(string s) {int i = 0, j = 0;int maxLength = 0;bool exist[256] = {false};int n = s.length();while (j < n){if (exist[s[j]])<span style="white-space:pre">	// 由于s[j] 中的是字符。能够自己主动转换为整型</span>{maxLength = max(maxLength, j - i);while(s[i] != s[j]){exist[s[i]] = false;i++;}i++;j++;}else{<span style="white-space:pre">	</span>exist[s[j]] = true;j++;}}maxLength = max(maxLength, n-i);<span style="white-space:pre">	// 别忘了这一步</span>return maxLength;}
};


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET 连接MySql数据库

ASP.NET Mysql操作类 以下连接MySql数据库以VS2010为例&#xff0c;对于其他的编辑器也差不多 1. 我们需要在Mysql官网下载一个组件http://dev.mysql.com/downloads/connector/net/ 下载最新版的即可&#xff0c;并且安装connector&#xff0c;其实仅仅只是为了得到Mysql.Data…

linux之安装boost环境

1 下载最新的boost代码包 网址www.boost.org,如果觉得网速很慢,你可以直接在别人的csdn那里去下载 地址:https://download.csdn.net/download/weixin_42404995/10508611,我这里就是用的这个boost_1_67_0.tar.gz 2 安装boost环境 1) 解压boost_1_67_0.tar.gz之后进入boost目…

IDL 自定义函数

function add,x,yreturn, xy endpro sumx1y2print,add(x,y) end

java反射有什么用_java反射的作用知识点总结

Java的反射机制是Java特性之一&#xff0c;反射机制是构建框架技术的基础所在。灵活掌握Java反射机制&#xff0c;对大家以后学习框架技术有很大的帮助。什么是Java的反射&#xff1f;反射是Java的特征之一&#xff0c;是一种间接操作目标对象的机制。JAVA反射机制是在运行状态…

【新版发布】ComponentOne 新增 .NET 6 和 Blazor 平台控件支持

ComponentOne Enterprise是葡萄城推出的一款内置 300 多种开发控件的 .NET控件集&#xff0c;可满足 WinForm、WPF、Blazor、ASP.NET MVC 等平台下的系统开发需求&#xff0c;提供表格数据管理、数据可视化、报表和文档等功能&#xff0c;被开发人员誉为“.NET开发的‘瑞士军刀…

python多进程和多线程一起使用_Python3多进程与多线程区别及使用(2.线程)

threading模块 简述&#xff1a; threading模块 threading.currentThread(): 返回当前的线程变量。 threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前&#xff0c;不包括启动前和终止后的线程。 threading.activeCount(): 返回正在运行…

Ruby如何成长成高性能系统构架

为什么80%的码农都做不了架构师&#xff1f;>>> 结束了一份Ruby为主的工作,想把个方面总结一下,这篇是关于系统性能方面的.以下数据都是简单回忆的数据,加之企业保密数据的需要,和精确数有些出入,仅供参考. 说起Ruby的性能,无论从官方到社区,都公认是劣于其它的框架…

Android之build.gradle配置签名

1 问题 android签名除了我们用android studio build->generate Signed Apks ... 我们还可以自己用build.gradle构建,容易忘记还是记录下来 2 配置如下 1) build.gradle文件如下 android {...signingConfigs {release {def prpe = new Properties()def input = project.…

ArcGIS 10.2数字化线状要素时自动拼接成一条线

&#xff08;1&#xff09;在已有线的基础上自动连接成一条线 数字化时&#xff0c;经常会碰到这种情况&#xff0c;不小心双击了&#xff0c;或者画到一半饿了&#xff0c;双击完成去吃饭了&#xff0c;回来继续画&#xff0c;该怎样去做呢&#xff1f; 一开始一直和捕捉和经典…

Python 字符串操作基础

1.Python 字符串 字符串可以看做是由单个文本字符构成的列表&#xff0c;每个字母构成一个列表元素&#xff0c;可以用下标取值&#xff0c;切片&#xff0c;用于for循环&#xff0c;用len()函数 name Zophoie name[2] name[-3] name[0:3]Zoin nameZOin name len(name)ZOOnot …

设置tableView的分割线从最左端开始

苹果原生的tableView的cell分割线默认是没有从最左端开始&#xff0c;有时候这样不免影响美观&#xff0c;有时也会有这样的需求&#xff0c;设置tableView的分割线从最左端开始&#xff1a; 不多说了&#xff0c;直接上代码吧&#xff1a; //分割线从顶端开始 --------适配iO…

java 定时 spring_Spring定时任务实现与配置(一)

朋友的项目中有点问题。他那边是Spring架构的&#xff0c;有一个比较简单的需要定时的任务执行。在了解了他的需求之后&#xff0c;于是提出了比较简单的Springquartz的实现方式。注意本文只是讨论&#xff0c;在已搭建完毕的Spring工程下&#xff0c;完成最简单的定时任务。第…

内核同步机制

内核中用于临界区保护下的互斥机制&#xff0c;它包括自旋锁、原子操作和信号量&#xff0c;三者保证了对临界资源访问的互斥型。 1.1 内核中的互斥机制 1.1.1 自旋锁 自旋锁用在多个CPU系统中。当一个线程在一个CPU上正使用资源&#xff0c;而另一个线程在另一个CPU上正忙等待…

makefile运行_NVDIA TX2入门 系列之三:运行Yolov3

上篇TX2安装完成OpenCV 3.4.0之后&#xff0c;基本软件包已经安装完成&#xff0c;本篇开始安装并运行大名鼎鼎的号称速度最快的目标识别分类算法Yolov3。Yolov3 是啥啊Yolov3是一款基于darknet深度学习框架的目标检测开源项目&#xff0c;目前已经发展到第3版本&#xff0c;即…

.NET7之MiniAPI(特别篇):.NET7 Preview3

.NET7的第三个预览版发布了&#xff0c;同样带来了mini api的更新&#xff0c;这次带来了路由过滤器&#xff0c;与mvc版的action 过滤器相似。具体见https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-7-preview-3/用官方的代码&#xff0c;跑不起来&…

C#实现树的双亲表示法

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace 树的实现 {public partial class Form1 : Form{public Form1(){Init…

C++编译之提示ld: can‘t open output file for writing: test1, errno=21 for architecture x86_64

1 问题 在mac 终端写了一个cpp文件&#xff0c;然后用命令编译运行提示错误如下 1111deMBP:code a1111$ g -stdc11 test1.cpp -o test1 ld: cant open output file for writing: test1, errno21 for architecture x86_64 clang: error: linker command failed with exit code…

MySQL存储写入速度慢分析

一、存储结构分析MySQL存储结构图&#xff1a;解析&#xff1a;1、读操作&#xff1a;内存读-->cache缓存读-->磁盘物理读读取到的数据会按上述顺序往回送。2、写操作&#xff1a;内存数据直接写入cache缓存(非常快)-->写入disk由上可知&#xff0c;MySQL之所以读写速…

windows 建立wifi热点

1、以管理员身份运行命令提示符&#xff1a;netsh wlan set hostednetwork modeallow ssidmywifi key123456其中ssid为wifi名称&#xff0c;key为wifi密码。2、设置Internet连接共享&#xff1a;在“网络连接”窗口中&#xff0c;右键单击已连接到Internet的网络连接&#xff0…

【C语言简单说】一:第一个C语言程序

注册CSDN有些年头了&#xff0c;但是从未写过任何任何的东西。 几年前的懵懵懂懂&#xff0c;现在虽然依旧懵懂但是还好&#xff0c;能够听得懂大触们大致再说神马东西了。 这段时间有点怀疑人生&#xff0c;由于本人才疏学浅&#xff0c;所以只好留下一点帮助小白级入门的干货…