LeeCode(No3 - Longest Substring Without Repeating Characters)
题目:
Given a string, find the length of the longest substring without repeating characters.
示例: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with the length of 1. Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
问题的难点在于光标移动过程中,一旦遇到重复需要重新开始计算长度
第一次提交的代码如下:
class Solution {
public int lengthOfLongestSubstring(String s) {
int longestLength = 0;
int currentLength = 0;
String longestStr = "";
char tmpChar;
int repeatIndex = 0; for(int i = 0; i < s.length(); i++){
tmpChar = s.charAt(i);
repeatIndex = longestStr.indexOf(tmpChar, 0);
// 遇到重复,从重复的下一位开始
if(repeatIndex >= 0) {
if(longestLength < currentLength){
longestLength = currentLength;
}
longestStr = longestStr.substring(repeatIndex + 1) + tmpChar;
currentLength = longestStr.length();
} else {
longestStr += s.charAt(i);
currentLength++;
}
} if(longestLength < currentLength) {
return currentLength;
} return longestLength;
}
}
提交后执行效率只击败了15.65%
为提高效率,考虑更新如下方面:
1. String 用StringBuilder替换(不需要线程安全,所以不使用开销大的StringBuffer)
2. char用String替换(是为了避免循环中char到String转换时的开销)
修改后的代码如下:
class Solution {
public int lengthOfLongestSubstring(String s) {
int longestLength = 0;
int currentLength = 0;
StringBuilder builder = new StringBuilder();
String charStr;
int repeatIndex; for(int i = 0; i < s.length(); i++){
charStr = s.substring(i, i + 1);
repeatIndex = builder.indexOf(charStr, 0);
// 遇到重复,从重复的下一位开始
if(repeatIndex >= 0) {
if(longestLength < currentLength){
longestLength = currentLength;
}
builder.delete(0, repeatIndex + 1);
builder.append(charStr);
currentLength = builder.length();
} else {
builder.append(charStr);
currentLength++;
}
} if(longestLength < currentLength) {
return currentLength;
} return longestLength;
}
}
提交后执行效率只击败了65.57%
如何再进一步提高效率呢?因为循环里面有查询字符存在的功能,考虑替换数据结构,用HashMap替换StringBuffer,
但是在思考了一会没有找到使用HashMap的写法,于是直接参考了现有的方案,如下:
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>(); // current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
if (map.containsKey(s.charAt(j))) {
i = Math.max(map.get(s.charAt(j)), i);
}
ans = Math.max(ans, j - i + 1);
map.put(s.charAt(j), j + 1);
}
return ans;
}
}
其实实现的逻辑跟之前的思路一致,j 作为整个字符串的额游标,i 作为遇到重复元素后重新开始位置的游标,ans记录最大值
这样的写法不但是用HashMap来代替String查找,而且不用单独存储子字符串。
复杂度如下:
Complexity Analysis
Time complexity : O(n)O(n). Index jj will iterate nn times.
Space complexity (HashMap) : O(min(m, n)).
参考:
https://leetcode.com/problems/longest-substring-without-repeating-characters
LeeCode(No3 - Longest Substring Without Repeating Characters)的更多相关文章
- 最长子串(Leetcode-3 Longest Substring Without Repeating Characters)
Question: Given a string, find the length of the longest substring without repeating characters. Exa ...
- LeeCode Algorithm #3 Longest Substring Without Repeating Characters
一开始以为是不连续的,其实要求子串是连续的.想法:two-pointer O(n)时间,再借助256大小的int数组.两个下标i,j(i<=j).对于i=0,找到最右侧的字符不重复的下标的后一位 ...
- LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)
题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...
- LeetCode:Longest Substring Without Repeating Characters(最长不重复子串)
题目链接 Given a string, find the length of the longest substring without repeating characters. For exam ...
- Longest Substring Without Repeating Characters(Difficulty: Medium)
题目: Given a string, find the length of the longest substring without repeating characters. Examples: ...
- LeetCode 3 Longest Substring Without Repeating Characters(最长不重复子序列)
题目来源:https://leetcode.com/problems/longest-substring-without-repeating-characters/ Given a string, f ...
- 【leetcode】Longest Substring Without Repeating Characters (middle)
Given a string, find the length of the longest substring without repeating characters. For example, ...
- 3. Longest Substring Without Repeating Characters (ASCII码128个,建立哈西表)
Given a string, find the length of the longest substring without repeating characters. For example, ...
- LeetCode OJ:Longest Substring Without Repeating Characters(最长无重复字符子串)
Given a string, find the length of the longest substring without repeating characters. For example, ...
随机推荐
- C连接oracle数据库
int db_conn_main() { EXEC SQL BEGEIN DECLARE SECTION; +]; +]; +]; varchar username[]; varchar passwo ...
- Windows版本Apache+php的Xhprof应用__[2]
[计划] “Windows版本Apache+php的Xhprof应用__[1]”中已经解决了下载,配置的问题,所以这里的工作是接着进行的,我们以调试一个 php代码的文件来看看是怎么用xhprof的. ...
- 全文检索技术---Lucene
1 Lucene介绍 1.1 什么是Lucene Lucene是apache下的一个开源的全文检索引擎工具包.它为软件开发人员提供一个简单易用的工具包(类库),以方便的在目标系统中实现 ...
- linux 监控内存介绍
一:系统监控:1.对cpu的监测:查看进程占用内存情况 top pid user PRI NI size RSS share stat 进程号 进程所属用户 优先级 优先级 进程所占空间 使用物理内存 ...
- Mysql date, time, timestamp日期时间相关
date: 格式:YYYY-MM-DD,时间范围:[0000-00-00, 9999-12-31],存储空间:3bytes time: 格式:HH:MM:SS,时间范围:[00:00:00, 23:5 ...
- String类型的理解
引用:https://www.cnblogs.com/binyue/p/3862276.html java语言中: 变量除了八大基本数据类型(byte,short,int,long,boolean,f ...
- Struts 第一天
请简述下Struts2 的执行流程. 首先是,启动tomcat服务器,这时候会加载web.xml,当读到filter标签时,会创建过滤器对象.struts2的核心过滤器(StrutsPrepareAn ...
- STM32 C++编程 004 Adc (数模转换)类
使用 C++ 语言给 STM32 编写一个 Adc 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的专栏 ...
- NSSelectorFromString 使用示例
NSSelectorFromString 动态加载实例方法. SEL sel = NSSelectorFromString(@"yourMethod:")//有参数 if([obj ...
- mingw和libcurl
想用curl来做rest的客户端.所以就研究下这方面东西. 1:安装mingw 为什么用mingw,小巧,必vs快,gcc了解的多一些, http://tdm-gcc.tdragon.net/down ...