问题描述:给定一个字符串,找出这个字符串中最长的不重复子串。比如对于字符串“sadus”,那么返回的结果应该是“sadu”或者“adus”(返回一个即可);对于字符串“acbba”,返回的应是“acb”。

对于这样一个问题,想必大家首先想到利用的数据结构是HashMap,利用HashMap来保证子串的不重复。但是我们可以想想能不能不用HashMap呢?答案显然是可以的,因为字符数是固定的,不超过256个!所以我们可以用一个长度为256的数组来记录所有字符的出现情况。

具体的思路是这样的:遍历整个字符串,针对每个字符做三件事

(1)   如果当前字符出现过并且该字符上一次出现时的index大于目前子串的初始index,那么将目前子串的初始index置为该字符上一次出现时的index。注意这个子串不一定是最大长度的子串,而是程序运行过程中当前的不重复子串。

(2)   如果当前的index与startIndex(目前子串的初始index)的差值大于maxLen(记录的最长不重复子串的长度),那么更新maxLen。注意,因为我们要输出这个不重复子串,所以我们在这时候(maxLen改变时)需要记录startIndex。

(3)   记录当前字符的index。

这样扫描完以后,我们就可以根据oriStartIndex(maxLen改变时记录的startIndex)和maxLen来得到最长不重复子串。

具体实现如下,其中findLongestSubString1()函数是利用HashMap来实现的,而findLongestSubString2()函数是利用数组来实现的,两者的算法思想是一模一样的,但是性能相差近10倍。

import java.util.HashMap;public class MaxSubString {public static void main(String[] args) {String str = "jhhjnsfudufbdfyscfbsdjjSAFASFsefyrsjksaudhsduhasdbg" +"ywqep[m,mzaASFASFhuwenzsdjsjfasfyaehwzsjx ;ASFASFlpwisjd" +"asuwnad.pqwekASFqowe92347174nsd sdfsdf73bwASFawue821b9sa" +"dasjdnasdqASFASASFF2en128adasjdnqwudSAASFF   ASFw 1wq89ewa" +"dasjdASFhqw8edeqwhedhqwueASFuquweuqwuehqw e123xrkASFajs8" +"9da2qe54we24eDASASAFFdfsdifhsd";long a = System.nanoTime();for(int count = 0; count < 100000; count++){findLongestSubString1(str);}long b = System.nanoTime() - a;System.out.println(b);a = System.nanoTime();for(int count = 0; count < 100000; count++){findLongestSubString2(str);}b = System.nanoTime() - a;System.out.println(b);System.out.println(findLongestSubString1(str));System.out.println(findLongestSubString2(str));}private static String findLongestSubString1(String str) {if(str == null) return null;StringBuilder maxSubString = new StringBuilder("");char [] strCharArr = str.toCharArray();HashMap<Character, Integer> charsIndex = new HashMap<Character, Integer>();int startIndex = -1, oriStartIndex = startIndex, maxLen = 0;for(int index = 0; index < strCharArr.length; index++) {if(charsIndex.containsKey(strCharArr[index])) {int oriIndex = charsIndex.get(strCharArr[index]);if(oriIndex > startIndex){startIndex = oriIndex;}}if(index - startIndex > maxLen) {maxLen = index - startIndex;oriStartIndex = startIndex;}charsIndex.put(strCharArr[index], index);}for(int index =  oriStartIndex + 1; index < oriStartIndex + maxLen + 1; index++) {maxSubString.append(strCharArr[index]);}return maxSubString.toString();}private static String findLongestSubString2(String str) {if(str == null) return null;StringBuilder maxSubString = new StringBuilder("");char [] strCharArr = str.toCharArray();int [] charsIndex = new int[256];for(int index = 0; index < 256; index++)  charsIndex[index] = -1;int startIndex = -1, oriStartIndex = startIndex, maxLen = 0;for(int index = 0; index < strCharArr.length; index++) {if(charsIndex[strCharArr[index]] > startIndex)startIndex = charsIndex[strCharArr[index]];if(index - startIndex > maxLen) {maxLen = index - startIndex;oriStartIndex = startIndex;}charsIndex[strCharArr[index]] = index;}for(int index =  oriStartIndex + 1; index < oriStartIndex + maxLen + 1; index++) {maxSubString.append(strCharArr[index]);}return maxSubString.toString();}
}

程序运行结果:

寻找字符串的最长不重复子串,计算复杂度O(n),两种实现相关推荐

  1. 最长不重复字符串python_Python简单实现查找一个字符串中最长不重复子串的方法...

    本文实例讲述了Python简单实现查找一个字符串中最长不重复子串的方法.,具体如下: 刚结束的一个笔试题,很简单,不多说简单贴一下具体的实现: #!usr/bin/env python #encodi ...

  2. python查找最长的字符串_Python简单实现查找一个字符串中最长不重复子串的方法...

    本文实例讲述了Python简单实现查找一个字符串中最长不重复子串的方法.分享给大家供大家参考,具体如下: 刚结束的一个笔试题,很简单,不多说简单贴一下具体的实现: #!usr/bin/env pyth ...

  3. c与指针 从一个字符串中提取子串_python实现找出来一个字符串中最长不重复子串...

    刚结束的一个笔试题,很简单,不多说简单贴一下具体的实现: #!usr/bin/env python#encoding:utf-8 '''__Author__:沂水寒城功能:找出来一个字符串中最长不重复 ...

  4. python找最长的字符串_Python简单实现查找一个字符串中最长不重复子串的方法

    本文实例讲述了Python简单实现查找一个字符串中最长不重复子串的方法.分享给大家供大家参考,具体如下: 刚结束的一个笔试题,很简单,不多说简单贴一下具体的实现: #!usr/bin/env pyth ...

  5. 【算法题】求一个字符串的最长不重复子串

    [题目描述] 求一个字符串的最长不重复子串.比如:给定"abcabcbb"的答案是"abc",长度是3:给定"bbbbb"的答案是" ...

  6. 字符串中最长无重复子串(O(n))

    2019独角兽企业重金招聘Python工程师标准>>> #include <iostream> #include <string>using namespac ...

  7. 最长重复子串和最长不重复子串求解

    最长重复子串和最长不重复子串求解 本文内容框架: §1 最长重复子串 基本方法.KMP算法求解.后缀数组求解 §2 最长不重复子串 基本方法.动态规划.动态规划+Hash §3 小结 §1最长重复子串 ...

  8. 寻找一个字符串中的最长不重复子串的长度

    2019独角兽企业重金招聘Python工程师标准>>> 算法使用两个下标来分别代表不重复子串的第一个字符的前一个字符和最后一个字符,记为i和j flag为长度,n为比较的参数 < ...

  9. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

最新文章

  1. java linux urlencode_iOS urlEncode编码解码(非过时方法,已解决)
  2. 我的世界服务器老是显示已断开,为什么我的服务器玩家老是掉线 - 有问必答 - 最MC论坛 - 我的世界_Minecraft_联机_服主_资讯_MOD_皮肤_交流_作品_中文论坛...
  3. OpenCV2学习笔记(十四):基于OpenCV卡通图片处理
  4. JAVA语法——经典题目01
  5. jquery源码抽丝剥茧--把jquery最小化
  6. Oracel官网下载各类版本的JDK
  7. CSDN的MarkDown编辑器插入图片时调整大小
  8. python某公司为员工发放奖品_python实现年会抽奖程序
  9. 数控机床手动编程能否用计算机验证,数控编程的方法有几种_数控编程的步骤...
  10. “RPC好,还是RESTful好?”,这个问题不简单!
  11. 干货~powershell与bash和docker在项目中怎么用
  12. 项目经理的三个立足点
  13. 海康、大华等安防摄像头、NVR、平台通过GB28181接入LieGBS国标流媒体服务
  14. android环信3.0v回撤,环信Android消息回撤
  15. gtest 中Setup TearDown SetUpTestCase和TearDownTestCase 的区别
  16. Machine Learning with Python Cookbook 学习笔记 第8章
  17. 本关任务:编写一个Point类,有x、y两个属性。编写一个PointDemo类,并提供一个distance(Point p1,Point p2)方法用于计算两点之间的距离,实例化两个具体的Point对
  18. 人工智能基础——搜索算法
  19. 一、springboot项目集成大众点评cat
  20. 【算法岗求职笔记】降维 · 五问五答

热门文章

  1. Qt入门教程【STL篇】QStack栈
  2. 关于edge浏览器下载
  3. 【数字逻辑】学习笔记 第五章 Part3 时序逻辑电路(常用时序逻辑电路及其应用)
  4. 设计师7个细微但是高效有用的习惯
  5. 基于C++的opencv中Mat矩阵运算方法总结
  6. ONLYOFFICE与O2OA参加西部教育博览会圆满成功
  7. [C语言] for循环详解 循环 for循环实例巧解
  8. Thingsboard 2.5 版本发布
  9. 容器docker(CentOS8)使用SSH配合Xming显示图形GUI界面
  10. 全加器在计算机的应用,两个半加器组成全加器的做法 浅谈全加器和半加器的应用...