最长不重复子串

  • 解决思路
  • 代码实现

解决思路

1.暴力搜索方法,优化检测重复的方法并剪枝;
step1:循环每个下标作为开始,标记为i;
step2:内循环每个下标作为结束,标记为j;
step3:在j向右的过程中,每得到一个新的字符就检测这个字符之前是否出现过,查重可以优化为使用map或者set方法。
step4:如果有重复,那么记录最长的距离,然后break,换到下一个i。

2.双指针法
step1:对字符串建立映射关系,char范围0-255,建立int数组大小256,记char的值去映射对应字符在串中所在下标。使用start记录最长不重复子串的起始下标。
step2:循环每个下标作为开始,标记为i;如果该字符未被映射,添加映射关系,已经映射过,则说明字符重复。
step3:字符重复或者下标循环结束时,比较子串长度和已记录最长自串长度的大小,更新最长不重复子串长度和start。
step4:字符重复时,通过映射关系,将下标start 到重复字符之间的映射关系清除,重置start和重复字符的最新映射位置.
step5 : 完成字符串遍历,得出最长不重复子串。

代码实现

方法一,使用map或者set效率差不多,处理流程也类似,这边提供使用map的方式。

int lengthOfLongestSubstring(string s)
{map<char, int> mymap;int len = s.length();int maxlen = 0;int maxi = 0, maxj = 0;for (int i = 0; i < len; i++){for (int j = i; j < len; j++){//判断子串是否已经包含该字符auto iter = mymap.find(s[j]);if (iter != mymap.end()){//如果字符重复,比较长度if (maxlen < (int)mymap.size()){maxlen = mymap.size();maxi = i;maxj = j;}mymap.clear();break;}mymap[s[j]] = j;if (j == len - 1){//从某个位置到字符串结束字符不重复,比较长度if (maxlen < (int)mymap.size()){maxlen = mymap.size();maxi = i;maxj = j;}mymap.clear();break;}}}return   maxlen;
}

方法二

int lengthOfLongestSubstring(string s)
{int str[256] = { 0x0 };memset(str, -1, sizeof(str));int len = s.length();int maxlen = 0;int start = 0;for (int i = 0; i < len; i++){if (str[s[i]] == -1){str[s[i]] = i;}else{//当前长度比较if (maxlen < i - start){maxlen = i - start;}// 这部分变成没出现过for (int j = start; j < str[s[i]]; ++j){str[s[j]] = -1;  }start = str[s[i]] + 1;//更新起点,头指针向后移动一位str[s[i]] = i;//更新字符出现位置,去除前面相同字符的映射关系}}// 从start到最后的串是不重复子串if (len - start > maxlen){maxlen = len - start;}return  maxlen;
}

[子串问题]最长不重复子串相关推荐

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

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

  2. 字符串最长不重复子串 java_最长不重复子串问题

    经典问题,记录一下这道题解法 问题描述 给定一个字符串,找到最长子串的长度,要求子串不含不重复字符. 样例 给定"pwkpwo"的答案是是4("kpwo"). ...

  3. 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...

    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathi ...

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

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

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

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

  6. [Jobdu] 题目1530:最长不重复子串

    题目描述: 最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的. 输入: 输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c... ...

  7. java 求最长重复子串_给定一个字符串,求出其最长的重复子串。

    #include #include #include #include using namespace std; //给定一个字符串,求出其最长的重复子串 //方法一 string lsubstr_1 ...

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

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

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

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

最新文章

  1. java拷贝压缩文件_Android java, 快速文件拷贝,文件压缩,获得系统时间 | 学步园...
  2. Redis集群读写分离架构搭建以及主从数据连通验证(附加集群口令认证以及Redis端口6379释放)
  3. hystrix熔断 简介_Hystrix简介–总结
  4. centos7 开启防火墙端口 firewalld
  5. 对keep-alive组件的理解
  6. 利用StringUtils可以避免空指针问题
  7. 操作可能会破坏运行时稳定性的解决办法
  8. 深度可分离卷积(Depthwise seperable convolution)
  9. meson和pkg-config
  10. 计算机音乐苹果铃声,iPhone实用技巧:怎么将抖音上的背景音乐制作成手机铃声-苹果手机铃声设置...
  11. POJ 3422 Kaka's Matrix Travels 已翻译
  12. 阿里经济体大数据平台的建设与思考
  13. PostgresQL窗口函数 last_value未返回预期结果原因排查
  14. elixir添加erlang模块
  15. python初中数学建模培训_中学生数学建模训练营VIP班
  16. oracle物理读优化,oracle 性能优化 06_sql优化
  17. 游戏服务器中多人交互逻辑业务的思考
  18. 【Ian Goodfellow课件】线性代数
  19. python 床前明月光_Python之利用Whoosh搭建轻量级搜索
  20. Srt字幕怎么批量添加并同时调整色调

热门文章

  1. IC验证中的force/release 学习整理(5)研究对 reg类型信号的影响
  2. vue源码分析系列二:$mount()和new Watcher()的执行过程
  3. 如何创建自定义DevExpress报表控件,看完你就懂了
  4. 在HbuilderX中实现微信小程序下蓝牙连接打印机完整实战案例
  5. 7和7的倍数游戏答案_【20190806维游戏——数字游戏篇】奥数天天练(1—6年级)...
  6. Hello Java
  7. 申请ISO13485认证的周期及费用
  8. ch340 win7 64位驱动下载
  9. io获取 pcl_PCL:点云常用操作
  10. 使用setuptools构建python包