题目:求一个字符串中最长的没有重复字符的子串。

思路:用hash表从i遍历查看包含i的最长 无重复子串。

int max_unique_substring2(char * str)
{int i,j;int begin;int maxlen = 0;int hash[256];int n = strlen(str);for(i=0; i<n; ++i){memset(hash,0,sizeof(hash)); hash[str[i]] = 1;for(j=i+1; j<n; ++j){if(hash[str[j]] == 0)hash[str[j]] = 1;elsebreak;}if(j-i > maxlen){maxlen = j-i;begin = i;}}printf("%.*s\n", maxlen, &str[begin]);return maxlen;
}

动态规划:

dp[i]表示以a[i]为结尾的最长不重复子串长度,初始状态dp[0]=1;  现在判断包含str[i]元素的最长不重复子串了,

主要是判断包含str[i[元素最长子串的起始位置。如果他与他前面的最长不重复子串都没有相同的字符,那么他也可以加入这个子串中,构成一个新的子串。  最终目的还是注意每个最长子串的起始位置。

/* LNRS dp */
int dp[30];void LNRS_dp(char * arr, int size)
{int i, j;int <strong>last_start </strong>= 0;     // 上一次最长子串的起始位置maxlen = maxindex = 0;dp[0] = 1;for(i = 1; i < size; ++i){for(j = i-1; j >= last_start; --j) // 遍历到上一次最长子串起始位置{if(arr[j] == arr[i]){dp[i] = i - j;<strong>last_start</strong> = j+1; // 更新last_startbreak;}else if(j == <strong>last_start</strong>) // 无重复{dp[i] = dp[i-1] + 1;}}if(dp[i] > maxlen){maxlen = dp[i];maxindex = i + 1 - maxlen;}}output(arr);
}

Hash

很多情况下,在描述一个字符串时,都是英文字母组成的字符,因此可能出现的元素是有限的(26个),因此就有了第二种想法,Hash。

这种想法在于使用一个大小为26的数组visited[]记录每个字符是否出现,然后枚举最长不重复子串的起点。代码如下:

 void LNRS_hash(char*  s){char visited[26];int i, j;int maxlen = 0;int maxIndex;int  len = strlen(s);memset(visited, -1, 26);for (i = 0; i < len; i++){visited[s[i] - 'a'] = 1;for(j = i+1 ; j < len; j++){if(visited[s[j]-'a'] == -1) //该字符没有出现{visited[s[j]-'a'] = 1;if(j - i+1> maxlen){maxlen = j - i+1;maxIndex = i;//最长不重复子串的起点}}elsebreak;}memset(visited, -1, 26);}printf("%d\n", maxlen);}

求字符串中最长无重复字符的子串相关推荐

  1. 求字符串中最长无重复子序列

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc" ...

  2. 【字符串】最长无重复字符子串练习题

    **对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度. 给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度.保证A中字符全部为小写英文字符,且长度小于等于500. ...

  3. 找到字符串的最长无重复字符子串

    题目: 给定一个字符串str,返回str中最长无重复字符子串的长度. 举例: str = "abcd",返回4.  str = "aabcb",返回3. 基本思 ...

  4. 《程序员代码面试指南》第五章 字符串问题 找到字符串的最长无重复字符子串...

    题目 找到字符串的最长无重复字符子串 java代码 努力中.... 转载于:https://www.cnblogs.com/lizhouwei/p/8955166.html

  5. 牛客题霸 [找到字符串的最长无重复字符子串] C++题解/答案

    牛客题霸 [找到字符串的最长无重复字符子串] C++题解/答案 题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 题解: i和j两个指针分别指不重复子 ...

  6. 常考数据结构与算法:找到字符串的最长无重复字符子串

    题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...

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

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

  8. 重复最多字符次数java_利用Java实现求字符串中出现次数最多的字符及次数

    利用Java实现求字符串中出现次数最多的字符及次数 发布时间:2020-11-12 16:57:24 来源:亿速云 阅读:108 作者:Leah 这篇文章将为大家详细讲解有关利用Java实现求字符串中 ...

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

    这是悦乐书的第341次更新,第365篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第2题Longest Substring Without Repeating Cha ...

最新文章

  1. 关联tomcat源代码
  2. 小憩,味一二 ——08年3月编程手札
  3. 云智一体趋势下,百度智能云打通技术与商业的共生闭环
  4. ASP.NET中WebForms简介与搭建HelloWorld项目
  5. emqtt 试用(二)验证 emq 和 mosquito 的共享订阅
  6. vue项目编写html,从头搭建、编写一个VUE项目
  7. Linux中打开文件管理器的命令
  8. phpcms attachment.class.php路径,解决phpcms上传不了图片的方法
  9. 2017.9.5 能量采集 思考记录
  10. java 校验的接口中的字符必须是半角的_初识Java,笔记1
  11. 哲理故事300篇 下
  12. 大型系统集成项目流程方案设计图
  13. 计算机基础中英文打字,中英文打字
  14. Regular DLL
  15. Mybatis-Plus入门案例、以及为什么不建议使用MP?
  16. sigmoid代码实现
  17. windows 快捷键
  18. Element 单元格合计(多行合计、合计列合并)
  19. 【Xilinx DMA SG】Xilinx DMA SG 模式
  20. boa linux arm修改网卡,Boa服务器在ARM+Linux上的移植

热门文章

  1. Wince 添加中文字库
  2. python的time库有哪些方法_Python的time模块中的常用方法整理
  3. echart 数据视图_关于数据可视化图表的制作,你需要关注的30个小技巧
  4. springboot整合elasticJob实战(纯代码开发三种任务类型用法)以及分片系统,事件追踪详解...
  5. 写一个函数返回参数二进制中 1 的个数
  6. JAVA架构师面试题and如何成为架构师
  7. ORA-03001,GATHER_TABLE_STATS数据库自动收集统计信息报错
  8. 算法学习-求两个整数的最大公约数
  9. php拆分数字字符串方法
  10. 10.4-全栈Java笔记:常用流详解(二)