题目:

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

  1. 最长子串(Leetcode-3 Longest Substring Without Repeating Characters)

    Question: Given a string, find the length of the longest substring without repeating characters. Exa ...

  2. LeeCode Algorithm #3 Longest Substring Without Repeating Characters

    一开始以为是不连续的,其实要求子串是连续的.想法:two-pointer O(n)时间,再借助256大小的int数组.两个下标i,j(i<=j).对于i=0,找到最右侧的字符不重复的下标的后一位 ...

  3. LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)

    题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...

  4. LeetCode:Longest Substring Without Repeating Characters(最长不重复子串)

    题目链接 Given a string, find the length of the longest substring without repeating characters. For exam ...

  5. Longest Substring Without Repeating Characters(Difficulty: Medium)

    题目: Given a string, find the length of the longest substring without repeating characters. Examples: ...

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

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

  7. 【leetcode】Longest Substring Without Repeating Characters (middle)

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

  8. 3. Longest Substring Without Repeating Characters (ASCII码128个,建立哈西表)

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

  9. LeetCode OJ:Longest Substring Without Repeating Characters(最长无重复字符子串)

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

随机推荐

  1. php学习笔记-定义数组和引用数组元素

    上图包含两种定义数组的方法,一种是通过数组索引来创建的,一种是通过array()函数来创建的.

  2. 分享常用的GoLang包工具

    包名 链接地址 备注 Machinery异步队列 https://github.com/RichardKnop/machinery Mqtt通信 github.com/eclipse/paho.mqt ...

  3. 《Head First Servlets & JSP》-6-会话管理

    容器怎么知道客户是谁 Http协议是无状态连接,客户浏览器与服务器建立连接.发出请求.得到响应,然后关闭连接.即,连接只针对一个请求/响应. 对容器而言,每个请求都来自于一个新的客户. 客户需要一个唯 ...

  4. [译]内联Javascript vs 外置Javascript

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  5. Java50道经典习题-程序46 字符串连接

    题目:编写一个两个字符串连接的程序 import java.util.Scanner; public class Prog46 { public static void main(String[] a ...

  6. 别了,DjVu!

    作者:马健邮箱:stronghorse_mj@hotmail.com发布:2010.05.21 目录一.DjVu技术二.掌握DjVu技术的人三.玩DjVu的人四.小结跋:我与DjVu 谨以此文纪念与D ...

  7. signalR之java client的websocket BUG处理

    最近在用SignalR,服务端已经写好(老铁,没毛病,很稳),然后有坑的是我还得写App端,那就撸吧,java也不是什么很难的东西.奈何坑多(已经踩了一波android的控件bug),这次遇到了MS的 ...

  8. vs code 提示快捷键

    1.ctrl+space 基本上被输入法快捷键占用 文件->首选项->键盘快捷方式(ctrl+k,ctrl+s):搜索 editor.action.triggerSuggest 换成 ct ...

  9. centos7.4版本安装nmon监控软件

    一.检查安装环境 # uname –a (查看操作系统信息,所检查服务器为64位操作系统) Linux iZ94pmb2p24Z 2.6.32-431.23.3.el6.x86_64 #1 SMP T ...

  10. 正经学C#_判断[switch语句]:[c#入门经典]

    switch是一个和IF语句极其相似的语句.但是Switch允许条件可以有多个值. 程序的基本结构如下 switch(textVal) { case Val: 程序代码 break case Val2 ...