LeetCode题解 || Longest Substring Without Repeating Characters (O(n)算法)问题
problem:
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.
thinking:
(1)寻找子串,要做一次遍历。
(2)暴力破解法,检查每个子串,利用hash table的映射思想。开一个数组,下标为字符的ASCII码,因为没有说明字符串的类型,能够採取一些措施压缩hash table的大小。暴力破解法的最坏时间复杂度为O(n*n)
(3)发现一个O(n)的算法。非常赞
事实上,这里非常多工作都是反复的、没用的。
看一个样例:
S="abbdeca"。
t1="abbdeca",t1[1]==t1[2]。
t2="bbdeca"。t2[0]==t2[1]。
t3="bdeca",一直扫描到最后。
t4="deca"、t5、t6、t7都同上。
我们在处理t1的时候已经扫描到了s[2],然后处理t3的时候扫描了s[2]到s[6],这两个子串已经扫描完了整个母串。
换言之,能使得子串停止扫描的位置仅仅有两处:1.s[2]。2.s[6](结尾)。
对于还有一个样例S="aaab",能使子串停止扫描的位置各自是:s[1],s[2],s[3](结尾)。
所以我们能够考虑仅仅扫描母串,直接从母串中取出最长的无反复子串。
对于s[i]:
1.s[i]没有在当前子串中出现过。那么子串的长度加1;
2.s[i]在当前子串中出现过,出现位置的下标为j。那么新子串的起始位置必须大于j,为了使新子串尽可能的长,所以起始位置选为j+1。
code:
说明:凝视的解法复杂度为O(n*n),没凝视的位O(n)
#include <iostream>
#include <string>
#include <memory.h> using namespace std;
/*
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int a[100]; //压缩hash table
memset(a,0,sizeof(int)*100);
int length = s.size();
int index=0;
int max=0;
for(int i=0;i<length;i++)
{
int j=i;
while((j<length)&&(a[s.at(j)-32]==0))//压缩hash table
{
a[s.at(j)-32]=1;
index++;
j++;
}
memset(a,0,sizeof(int)*100);
max=(max>index)?max:index;
index=0;
if(j==length-1) //这里也有一个小技巧。能够有效减少时间复杂度
break;
}
return max;
}
};
*/
class Solution {
public:
int lengthOfLongestSubstring(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int locs[256];//保存字符上一次出现的位置
memset(locs, -1, sizeof(locs)); int idx = -1, max = 0;//idx为当前子串的開始位置-1
for (int i = 0; i < s.size(); i++)
{
if (locs[s[i]] > idx)//假设当前字符出现过,那么当前子串的起始位置为这个字符上一次出现的位置+1
{
idx = locs[s[i]];
} if (i - idx > max)//这里是关键! !!!!! ! !!
{
max = i - idx;
} locs[s[i]] = i;
}
return max;
}
};
int main()
{
string str = "abcdab";
Solution mysolution;
cout<<mysolution.lengthOfLongestSubstring(str)<<endl; }
LeetCode题解 || Longest Substring Without Repeating Characters (O(n)算法)问题的更多相关文章
- [LeetCode 题解]: Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. For example, ...
- LeetCode题解——Longest Substring Without Repeating Characters
题目: 给定一个字符串,返回其中不包含重复字符的最长子串长度. 解法: 维持两个指针,第一个指向子串开始,第二个负责遍历,当遍历到的字符出现在子串内时,应计算当前子串长度,并更新最长值:然后第一个指针 ...
- C++版- Leetcode 3. Longest Substring Without Repeating Characters解题报告
Leetcode 3. Longest Substring Without Repeating Characters 提交网址: https://leetcode.com/problems/longe ...
- [Leetcode Week1]Longest Substring Without Repeating Characters
Longest Substring Without Repeating Characters题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/longes ...
- LeetCode 3 Longest Substring Without Repeating Characters(最长不重复子序列)
题目来源:https://leetcode.com/problems/longest-substring-without-repeating-characters/ Given a string, f ...
- LeetCode 3 Longest Substring Without Repeating Characters 解题报告
LeetCode 第3题3 Longest Substring Without Repeating Characters 首先我们看题目要求: Given a string, find the len ...
- [LeetCode] 3. Longest Substring Without Repeating Characters 解题思路
Given a string, find the length of the longest substring without repeating characters. For example, ...
- [LeetCode][Python]Longest Substring Without Repeating Characters
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/longest ...
- LeetCode之Longest Substring Without Repeating Characters
[题目描述] Given a string, find the length of the longest substring without repeating characters. Exampl ...
随机推荐
- 搭建自己的websocket server_1
用Node.js实现一个WebSocket的Server. https://github.com/sitegui/nodejs-websocket#event-errorerr nodejs-we ...
- php 判断过去离现在几年的函数
function gettime($worktime){ $time=time(); $amount=date("Y",$time)-date("Y",strt ...
- ROS-TF-广播
前言:将海龟的坐标系变换广播到TF. URDF文件的描述是在相对坐标上进行的,运动起来就需要考虑机器人各个连杆的相对位置关系.TF的诞生就是为了自动管理这些相对关系下的坐标变换的,而我们需要做的就是给 ...
- Super超级ERP系统---(7)货位管理
货位是ERP系统总的仓库管理中必不可少的,仓库是有货架组成,货架上的每个格子就是一个货位,所有货位上的商品的库存总和就是仓库商品的库存.仓库的货位主要分为货架和托盘,货架就是仓库的固定货位,托盘就是移 ...
- 等等空格用法
平时经常用到 空格转移字符,记住一个 表示一个字符就可以了. Non-Breaking SPace 记住它是什么的缩写,更有助于我们记忆和使用.下面的字符转义自己视图翻译一下. 记录一下,空格的转 ...
- css处理图片下方留白问题
引用图片的时候,图片和下方内容会有一点小空白,大概如下图紫色横条: 不是说有margin还是padding,是因为ing是行级元素,浏览器就会默认留白了,这时候处理方法很简单,给img加上样式disp ...
- MAVEN学习笔记之基础(1)
MAVEN学习笔记之基础(1) 0.0 maven文件结构 pom.xml src main java package resource test java package resource targ ...
- Splash Screen(短时间弹出框,信息显示一次)
原文引自codeproject site, http://www.codeproject.com/Articles/6511/Transparent-Splash-Screen 1.A splash ...
- 【转】DBSCAN密度聚类算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-M ...
- input type=”file“ change事件只执行一次的问题
js解决办法 HTML:<input id="file",type="file" onchange="upload()" /> ...