Longest Substring Without Repeating Characters - 哈希与双指针
题意很简单,就是寻找一个字符串中连续的最长包含不同字母的子串。
其实用最朴素的方法,从当前字符开始寻找,找到以当前字符开头的最长子串。这个方法猛一看是个n方的算法,但是要注意到由于字符数目的限制,其实这是个O(Cn)的算法,最长也不过是C长度。所以我觉得普通方法应该是能过的。
于是写了一个,字符数目最大也不超过256所以代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int res=;
for(int i=;i<s.length();i++)
{
int flag[];
memset(flag,,sizeof(flag));
int count = ;
flag[s[i]-' '] = ;
int tempres = ;
for (int j = i + ; j < s.length(); j++) {
if (flag[s[j]-' ']==) {
flag[s[j]-' ']= ;
tempres++;
} else
break;
}
if (tempres > res)
res=tempres;
}
return res;
}
};
其中空格是ASCII码第一个实际意义字符,所以减去‘ ’
正常的O(n)方法是使用哈希表来存已经出现的字符,使用一个指针依次检索,如果碰到已经存在的字符,则去使用第二个指针更新这个哈希表。
从原理上来具体讨论双指针这个算法,对于第一个指针指到的字母有两种情况:
1.从来没有使用过
当前长度加一,将这个位置和字母加入哈希表,第二个指针不动
2.已经使用过,并且有一个哈希表存这个字母的上一个位置
获取上一个位置右侧位置(+1操作),将这个位置和第二个指针比较,
(1)如果小于第二个指针,说明以当前结尾的字符串在第j个指针的地方有字母重复,忽略这个位置,继续以j为准
(2)如果大于第二个指针,说明以当前结尾的字符串在这个最新的位置有重复,将指针移到这个位置,计算这个长度。
这三种情况涵盖了所有可能,并在下面的例子中有相应出现。
代码:
此代码来自最多discuss区最多vote的答案:https://leetcode.com/discuss/23883/11-line-simple-java-solution-o-n-with-explanation
public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max=0;
for (int i=0, j=0; i<s.length(); ++i){
if (map.containsKey(s.charAt(i))){
j = Math.max(j,map.get(s.charAt(i))+1);
}
map.put(s.charAt(i),i);
max = Math.max(max,i-j+1);
}
return max;
}
例子:
对于这个字符串:abcbcda
经过初始化循环执行过程如下:
i=0; j=0; (a,0) max(0,1)=1 第一种情况
i=1; j=0; (b,1) max(1,2)=2 同上
i=2; j=0; (c,2) max(2,3)=3 同上
i=3; j=(0,1+1)=2; (b,3) max(3,2)=3 第二种第二个情况
i=4; j=(2,2+1)=3; (c,4) max(3,2)=3 同上
i=5; j=3; (d,5) max(3,3)=3 第一种情况
i=6; j=(3,1)=3; (a,6) max(3,4)=4 第二种第一个情况
Longest Substring Without Repeating Characters - 哈希与双指针的更多相关文章
- 《LeetBook》leetcode题解(3):Longest Substring Without Repeating Characters[M]——哈希判断重复
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- [LeetCode_3] Longest Substring Without Repeating Characters
LeetCode: 3. Longest Substring Without Repeating Characters class Solution { public: int lengthOfLon ...
- Longest Substring Without Repeating Characters (c#)
Given a string, find the length of the longest substring without repeating characters. For example, ...
- LeetCode3:Longest Substring Without Repeating Characters
题目: Given a string, find the length of the longest substring without repeating characters. For examp ...
- Leetcode经典试题:Longest Substring Without Repeating Characters解析
题目如下: Given a string, find the length of the longest substring without repeating characters. Example ...
- C++版- Leetcode 3. Longest Substring Without Repeating Characters解题报告
Leetcode 3. Longest Substring Without Repeating Characters 提交网址: https://leetcode.com/problems/longe ...
- 3.Longest Substring Without Repeating Characters(string; HashTable)
Given a string, find the length of the longest substring without repeating characters. For example, ...
- 蜗牛慢慢爬 LeetCode 3. Longest Substring Without Repeating Characters [Difficulty: Medium]
题目 Given a string, find the length of the longest substring without repeating characters. Examples: ...
- LeetCode第[3]题(Java):Longest Substring Without Repeating Characters 标签:Linked List
题目中文:没有重复字符的最长子串 题目难度:Medium 题目内容: Given a string, find the length of the longest substring without ...
随机推荐
- MOSS 2010 无法同步用户配置文件
The management agent “MOSSAD-Synch AD Connection” failed on run profile “DS_DELTAIMPORT” because of ...
- Date对象需要注意的点
var today=new Date(); Date对象取得了PC内部时钟的一个快照,并同时返回一个Date对象实例. 注意静态Date对象和Date对象实例的差别,后者包含一个实际的日期值.毫秒为单 ...
- oracle 11g RAC Grid Infrastructure
grid infrastructure 软件介质下载: http://www.oracle.com/technetwork/database/database-technologies/cluster ...
- c#观察者模式学习笔记(1)
c#中的观察者是一种逻辑上很重要的角色,在服务端,观察者是服务端的通讯员,它将事件与业务紧密的结合,彼此又能按照逻辑进行分离. 实现方法为: (1)声明事件的委托原型,作为事件订阅的回调. (2)使用 ...
- ios 设备用jquery live绑定 click 事件不管用
问题描述:用js拼接的html追加到页面,然后用 live 绑定click事件不起作用 解决办法:1.直接在标签写onclick事件 2.给需要绑定的标签添加css样式{cursor:pointe ...
- BootStrap 智能表单系列 九 表单图片上传的支持
本章介绍如何在生成表单后,可以支持上传图片后可以及时预览图片 代码如下(连接地址:https://github.com/xiexingen/Bootstrap-SmartForm/blob/maste ...
- 用 rsync 同步本地和服务器的文件
参考 DigitalOcean 安装 For Debian/Ubuntu: sudo apt-get install rsync For OpenSUSE/Fedora: sudo yum insta ...
- JS图表组件 highcharts 简单的介绍
把highcharts拿来做个简单的介绍,希望更多的朋友可以用到这个用来做图表的js插件. preparation Highcharts Highcharts是一个制作图表的纯Javascript类库 ...
- jbpmAPI-4
Chapter 4. Examples 4.1.介绍基于web的工作台在默认情况下将安装两个样本库,包含各种示例项目,帮助你开始.本节显示了不同的例子可以发现在jbpm-playground库(也可用 ...
- C和指针 读书笔记
准备复习一下之前读过的<C和指针>,主要看之前标记过的地方. 感觉像第一次看的地方再记录一下-- 1.预处理器读入源代码,根据预处理指令对其进行修改,然后将修改后的源代码交给编译器. 2. ...