[leetcode]_Longest Substring Without Repeating Characters
问题:求一个字符串中最长不重复子串的长度。
直接思路:以每个字符为出发计算最长不重复子串。TLE。O(n2),HashMap存储字符出现的位置。
代码:
public int lengthOfLongestSubstring(String s) {
Map<Character , Integer> temp = new HashMap<Character , Integer>();
int len = s.length();
int tempLen = 0,maxLen = 0;
int i = 0;
while(i < len){
char ch = s.charAt(i);
temp.put(ch , i);
tempLen = 1;
for(int j = i + 1 ; j < len ; j++){
char ch2 = s.charAt(j);
if(!temp.containsKey(ch2)) {
temp.put(ch2 , j);
tempLen++;
}else{
if(tempLen > maxLen) maxLen = tempLen;
//这里我还很得意,下次从重复的字符的下一位开始,但是依旧是TLE
i = temp.get(ch2) + 1;
temp.clear();
break;
}
}
}
return maxLen;
}
提交了很多次依旧TLE。不得其解,求助之。
网络上解题思路与我是一样的,当遇到重复字符时,下次再计算最长子串时从重复字符的下一个字符开始,但是为什么会TLE呢?经分析别人的代码后,发现。

这个思路没问题,TLE的原因在于原先判断重复地方后,在里层for循环重复计算了映射到map中的值(map中存储字符出现的位置,其实计算多少次值都是一样的),为了不重复计算此部分的map值,引入一个新的标记位start ,当重复位置在start之前时,对找最长子串不影响,直接更新map中的映射即可;当重复位置在start之后时,此时比较cur - start(此次的最长子串)是否能更新maxLen。这样将O(n2)优化为O(n)。
public int lengthOfLongestSubstring(String s) {
Map<Character , Integer> hash = new HashMap<Character , Integer>();
int len = s.length();
int maxLen = 0,start = 0;
for(int i = 0 ; i < len ; i++){
char ch = s.charAt(i);
if(!hash.containsKey(ch)){
hash.put(ch , i);
}else{
int last = hash.get(ch);
if(last < start) hash.put(ch , i);
//如果该字符上次出现的位置在start之前,对结果不产生影响,相当于这个位置已经被废掉的,直接更新即可。
else{
if(i - start > maxLen) maxLen = i - start;
hash.put(ch , i);
start = last + 1;
//将start的位置更新为重复位置的下一位
}
}
}
if(len - start > maxLen) maxLen = len - start;
//循环结束时,需要对最后一个不重复子串的长度进行判断
return maxLen;
}
另一个优化地方:
上面代码使用Map来存储字符出现位置,这里可用数组来模拟HashMap提高效率。申请一个int[] hashTable = new int[256];将其初始化为-1。256个包含了ASCII码表所有字符,之后遇见统计字符数量什么的,可参考这种方法。
提交后RunTime从528ms -> 424ms。
[leetcode]_Longest Substring Without Repeating Characters的更多相关文章
- LeetCode 3_Longest Substring Without Repeating Characters
LeetCode 3_Longest Substring Without Repeating Characters 题目描写叙述: Given a string, find the length of ...
- [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
July 16, 2015 Problem statement: Longest Substring Without Repeating Characters Read the blog: http: ...
- [LeetCode] Longest Substring Without Repeating Characters 最长无重复字符的子串
Given a string, find the length of the longest substring without repeating characters. Example 1: In ...
- C++ leetcode Longest Substring Without Repeating Characters
要开学了,不开森.键盘声音有点大,担心会吵到舍友.今年要当个可爱的技术宅呀~ 题目:Given a string, find the length of the longest substring w ...
- [LeetCode]Longest Substring Without Repeating Characters题解
Longest Substring Without Repeating Characters: Given a string, find the length of the longest subst ...
- [LeetCode] Longest Substring Without Repeating Characters 最长无重复字符的子串 C++实现java实现
最长无重复字符的子串 Given a string, find the length of the longest substring without repeating characters. Ex ...
- LeetCode:Longest Substring Without Repeating Characters(最长不重复子串)
题目链接 Given a string, find the length of the longest substring without repeating characters. For exam ...
- LeetCode: 3_Longest Substring Without Repeating Characters | 求没有重复字符的最长子串的长度 | Medium
题目: Given a . For . 解题思路: 这个题让找一个字符串中具有不重复单词的最长子串的长度,如:ababc,子串为abc,长度为3.有这么几个方法: 方法一: 依赖字符串本身的一些特有函 ...
随机推荐
- C++学习50 对字符串流的读写
文件流是以外存文件为输入输出对象的数据流,字符串流不是以外存文件为输入输出的对象,而以内存中用户定义的字符数组(字符串)为输入输出的对象,即将数据输出到内存中的字符数组,或者从字符数组(字符串)将数据 ...
- php mysql 中文乱码解决方法
本文章向码农们介绍php mysql 中文乱码解决方法,对码农们非常实用,需要的码农可以参考一下. 从MySQL 4.1开始引入多语言的支持,但是用PHP插入的中文会出现乱码.无论用什么编码也不行 解 ...
- C# 学习的随笔【随时更新】
1.结束自己 Application.Exit(); //这个东西有重载函数
- UltraEdit 除去行首的行号和空格
我们在复制代码的时候,经常会发生这种事情. 例如:如下文件(lpc17xx_libcfg.h) 00001 /********************************************* ...
- java的文件流:字节流(FileInputStream、FileOutputStream)和字符流(FileReader、FileWriter)。
java的输入输出建立在4个抽象类的基础上:InputStream.OutputStream.Reader.Writer.InputSream和OutputStream被设计成字节流类,而Reader ...
- c# 调用 CRFs应用程序
今天想用C#调用crfs,但是老出问题.原因有几点.第一,我对crf不理解,虽然我用cmd跑了一遍,但是根本不理解为什么,而且只是草草看了下参数该输入什么,只是了解了形式,没有了解实质.所以在调用的时 ...
- [系统] 安装Ubuntu 双系统 - 失败
因为工作原因, 所以需要装ubuntu系统. 在网络上查了一下, 一般都是使用U盘安装. 但是由于手头上既没有U盘又没有光盘,只能用硬盘安装了. 查一下, 使用wubi安装方式从硬盘安装, 非常方便. ...
- Class attributes
In order to print Card objects in a way that people can easily read, we need a mapping from the inte ...
- 多线程(二)NSThread
一.NSThread优缺点 优点:NSThread是最轻量级的 缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销 二.NSThread的使用 ...
- RC振荡器与有源滤波器1
自我总结,有错误欢迎指出! 一.振荡器原理: 对于正反馈,有如下公式: 讨论: 1.当A*F(jw)=1时 Af→∞(物理意义:自激振荡): 2.在f0上,F(jw)相移为0或2n∏:(因此,在f0处 ...