问题:求一个字符串中最长不重复子串的长度。

直接思路:以每个字符为出发计算最长不重复子串。TLE。O(n2),HashMap存储字符出现的位置。

代码:

  1. public int lengthOfLongestSubstring(String s) {
  2. Map<Character , Integer> temp = new HashMap<Character , Integer>();
  3. int len = s.length();
  4. int tempLen = 0,maxLen = 0;
  5. int i = 0;
  6. while(i < len){
  7. char ch = s.charAt(i);
  8. temp.put(ch , i);
  9. tempLen = 1;
  10. for(int j = i + 1 ; j < len ; j++){
  11. char ch2 = s.charAt(j);
  12. if(!temp.containsKey(ch2)) {
  13. temp.put(ch2 , j);
  14. tempLen++;
  15. }else{
  16. if(tempLen > maxLen) maxLen = tempLen;
  17. //这里我还很得意,下次从重复的字符的下一位开始,但是依旧是TLE
  18. i = temp.get(ch2) + 1;
  19. temp.clear();
  20. break;
  21. }
  22. }
  23. }
  24. return maxLen;
  25. }

提交了很多次依旧TLE。不得其解,求助之。

网络上解题思路与我是一样的,当遇到重复字符时,下次再计算最长子串时从重复字符的下一个字符开始,但是为什么会TLE呢?经分析别人的代码后,发现。

这个思路没问题,TLE的原因在于原先判断重复地方后,在里层for循环重复计算了映射到map中的值(map中存储字符出现的位置,其实计算多少次值都是一样的),为了不重复计算此部分的map值,引入一个新的标记位start ,当重复位置在start之前时,对找最长子串不影响,直接更新map中的映射即可;当重复位置在start之后时,此时比较cur - start(此次的最长子串)是否能更新maxLen。这样将O(n2)优化为O(n)。

  1. public int lengthOfLongestSubstring(String s) {
  2. Map<Character , Integer> hash = new HashMap<Character , Integer>();
  3.  
  4. int len = s.length();
  5. int maxLen = 0,start = 0;
  6. for(int i = 0 ; i < len ; i++){
  7. char ch = s.charAt(i);
  8. if(!hash.containsKey(ch)){
  9. hash.put(ch , i);
  10. }else{
  11. int last = hash.get(ch);
  12. if(last < start) hash.put(ch , i);
  13. //如果该字符上次出现的位置在start之前,对结果不产生影响,相当于这个位置已经被废掉的,直接更新即可。
  14.  
  15. else{
  16. if(i - start > maxLen) maxLen = i - start;
  17. hash.put(ch , i);
  18. start = last + 1;
  19. //将start的位置更新为重复位置的下一位
  20. }
  21. }
  22. }
  23. if(len - start > maxLen) maxLen = len - start;
  24. //循环结束时,需要对最后一个不重复子串的长度进行判断
  25.  
  26. return maxLen;
  27. }

另一个优化地方:

上面代码使用Map来存储字符出现位置,这里可用数组来模拟HashMap提高效率。申请一个int[] hashTable = new int[256];将其初始化为-1。256个包含了ASCII码表所有字符,之后遇见统计字符数量什么的,可参考这种方法。

提交后RunTime从528ms -> 424ms。

[leetcode]_Longest Substring Without Repeating Characters的更多相关文章

  1. LeetCode 3_Longest Substring Without Repeating Characters

    LeetCode 3_Longest Substring Without Repeating Characters 题目描写叙述: Given a string, find the length of ...

  2. [LeetCode] Longest Substring Without Repeating Characters 最长无重复子串

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

  3. leetcode: longest substring without repeating characters

    July 16, 2015 Problem statement: Longest Substring Without Repeating Characters Read the blog: http: ...

  4. [LeetCode] Longest Substring Without Repeating Characters 最长无重复字符的子串

    Given a string, find the length of the longest substring without repeating characters. Example 1: In ...

  5. C++ leetcode Longest Substring Without Repeating Characters

    要开学了,不开森.键盘声音有点大,担心会吵到舍友.今年要当个可爱的技术宅呀~ 题目:Given a string, find the length of the longest substring w ...

  6. [LeetCode]Longest Substring Without Repeating Characters题解

    Longest Substring Without Repeating Characters: Given a string, find the length of the longest subst ...

  7. [LeetCode] Longest Substring Without Repeating Characters 最长无重复字符的子串 C++实现java实现

    最长无重复字符的子串 Given a string, find the length of the longest substring without repeating characters. Ex ...

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

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

  9. LeetCode: 3_Longest Substring Without Repeating Characters | 求没有重复字符的最长子串的长度 | Medium

    题目: Given a . For . 解题思路: 这个题让找一个字符串中具有不重复单词的最长子串的长度,如:ababc,子串为abc,长度为3.有这么几个方法: 方法一: 依赖字符串本身的一些特有函 ...

随机推荐

  1. [ActionScript3.0] 深表复制

    function clone(obj:Object):Object{ var byteArray:ByteArray = new ByteArray(); byteArray.writeObject( ...

  2. JAVA中复写equals方法

    在JAVA中“==”用于比较两个引用对象的地址是否相同.但是如果我们想比较两个对象的内容是否相同,通常会覆写equals方法.equals方法用来比较两个对象的内容是否相等. package org. ...

  3. sikuli+java实例

      新建java工程,导入sikuli-script.jar包 public class TestSikuli { public static void openPage() throws FindF ...

  4. 中文系统下,UTF-8编码文本文件读取导致的错误

    一.UTF-8编码文件读取导致的错误 有个txt文件,里面内容为: aaa bbb ccc 以UTF-8编码方式打开txt文件,顺序读取,将里面的值放到一个hashset中,并判断aaa是否在在has ...

  5. 算法库:Matlab与C++混合编程

    算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...

  6. weblogic诊断案例-AdminServer平均1-2周崩溃

    OS2台:RH5.5 64位 WEBLOGIC VERSION:9.2.3 JDK:1.5 64位 weblogic一个管理服务,4个受管(2台服务器做集群,每台服务器2个受管).应用部署后通过一个月 ...

  7. ArcGIS 通视分析工作原理

    通过通视分析工具可根据在 3D 空间中相对于某表面或多面体要素类提供的障碍的位置,计算各线要素的第一个和最后一个折点之间的通视性.前一个折点定义为观测点,后一个折点为观测目标.沿着这些点之间的视线确定 ...

  8. Python的方法分类

    1.Python的类方法,实例方法,和静态方法 class S(object): def Test(self): print("TEST") @classmethod#类方法 de ...

  9. (整理).net实现条形码与二维码

    本文由来源网络的知识点组合而成,感谢分享的作者,文章结尾处给出查询资料连接. 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符.常见的条形码是 ...

  10. Eclipse不能进入断点

    如题:Eclipse不能进入断点,可能是项目没有build,如果是maven项目,clean,在maven install就可以了