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)算法)问题的更多相关文章

  1. [LeetCode 题解]: Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. For example, ...

  2. LeetCode题解——Longest Substring Without Repeating Characters

    题目: 给定一个字符串,返回其中不包含重复字符的最长子串长度. 解法: 维持两个指针,第一个指向子串开始,第二个负责遍历,当遍历到的字符出现在子串内时,应计算当前子串长度,并更新最长值:然后第一个指针 ...

  3. C++版- Leetcode 3. Longest Substring Without Repeating Characters解题报告

    Leetcode 3. Longest Substring Without Repeating Characters 提交网址: https://leetcode.com/problems/longe ...

  4. [Leetcode Week1]Longest Substring Without Repeating Characters

    Longest Substring Without Repeating Characters题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/longes ...

  5. LeetCode 3 Longest Substring Without Repeating Characters(最长不重复子序列)

    题目来源:https://leetcode.com/problems/longest-substring-without-repeating-characters/ Given a string, f ...

  6. LeetCode 3 Longest Substring Without Repeating Characters 解题报告

    LeetCode 第3题3 Longest Substring Without Repeating Characters 首先我们看题目要求: Given a string, find the len ...

  7. [LeetCode] 3. Longest Substring Without Repeating Characters 解题思路

    Given a string, find the length of the longest substring without repeating characters. For example, ...

  8. [LeetCode][Python]Longest Substring Without Repeating Characters

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/longest ...

  9. LeetCode之Longest Substring Without Repeating Characters

    [题目描述] Given a string, find the length of the longest substring without repeating characters. Exampl ...

随机推荐

  1. Tool-杂项-建模:犀牛(3D造型软件)

    ylbtech-Tool-杂项-建模:犀牛(3D造型软件) 犀牛(Rhino)是美国Robert McNeel & Assoc.开发的PC上强大的专业3D造型软件,它可以广泛地应用于三维动画制 ...

  2. 1-1restful简介及资源介绍

  3. cas-client-core单点登录排除不需要拦截的URL

    同事提了一个要求,要求对外提供的接口不需要经过单点登录验证,我刚开始想,这简单,提供不需要拦截的url数组,在AuthenticationFilter里面对url进行检查,在此数组内,就不需要拦截. ...

  4. idea的环境变量设置(Enviroment variables)

  5. android随手记

    Linearlayout: gravity:本元素中所有子元素的重力方向     layout_gravity:本元素对于父元素的重力方向 自定义权限:http://www.cnblogs.com/i ...

  6. 体验:Anko + Kotlin

    ● 依赖:compile 'org.jetbrains.anko:anko:0.10.0' ● 界面: import android.view.View import org.jetbrains.an ...

  7. Firebird Character Sets and Collations

    Firebird Character Sets and Collations Every CHAR or VARCHAR field can (or, better: must) have a cha ...

  8. 搜索关键词和类目url简短化

    电商网站中有很多搜索关键词或者类目的url往往是一大串的url:有个需求是将长的url如: 域名+/products.html?q=大侠&showtype=img&sort=isTra ...

  9. (转)基于MVC4+EasyUI的Web开发框架经验总结(6)--在页面中应用下拉列表的处理

    http://www.cnblogs.com/wuhuacong/p/3840321.html 在很多Web界面中,我们都可以看到很多下拉列表的元素,有些是固定的,有些是动态的:有些是字典内容,有些是 ...

  10. PhotoZoom Pro 7怎么进行参数设置

    每个用户在使用PhotoZoom时,在针对不同的图片,我们处理的方式也不同.所以在参数设置会因图片不同而不同.那么在PhotoZoom中参数究竟如何设置呢? 首先,我们先打开[参数设置],点击后会弹出 ...