求字符串中最长无重复字符的子串
题目:求一个字符串中最长的没有重复字符的子串。
思路:用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:输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc" ...
- 【字符串】最长无重复字符子串练习题
**对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度. 给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度.保证A中字符全部为小写英文字符,且长度小于等于500. ...
- 找到字符串的最长无重复字符子串
题目: 给定一个字符串str,返回str中最长无重复字符子串的长度. 举例: str = "abcd",返回4. str = "aabcb",返回3. 基本思 ...
- 《程序员代码面试指南》第五章 字符串问题 找到字符串的最长无重复字符子串...
题目 找到字符串的最长无重复字符子串 java代码 努力中.... 转载于:https://www.cnblogs.com/lizhouwei/p/8955166.html
- 牛客题霸 [找到字符串的最长无重复字符子串] C++题解/答案
牛客题霸 [找到字符串的最长无重复字符子串] C++题解/答案 题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 题解: i和j两个指针分别指不重复子 ...
- 常考数据结构与算法:找到字符串的最长无重复字符子串
题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...
- 字符串中最长无重复子串(O(n))
2019独角兽企业重金招聘Python工程师标准>>> #include <iostream> #include <string>using namespac ...
- 重复最多字符次数java_利用Java实现求字符串中出现次数最多的字符及次数
利用Java实现求字符串中出现次数最多的字符及次数 发布时间:2020-11-12 16:57:24 来源:亿速云 阅读:108 作者:Leah 这篇文章将为大家详细讲解有关利用Java实现求字符串中 ...
- LeetCode.3-最长无重复字符子串(Longest Substring Without Repeating Characters)
这是悦乐书的第341次更新,第365篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第2题Longest Substring Without Repeating Cha ...
最新文章
- 关联tomcat源代码
- 小憩,味一二 ——08年3月编程手札
- 云智一体趋势下,百度智能云打通技术与商业的共生闭环
- ASP.NET中WebForms简介与搭建HelloWorld项目
- emqtt 试用(二)验证 emq 和 mosquito 的共享订阅
- vue项目编写html,从头搭建、编写一个VUE项目
- Linux中打开文件管理器的命令
- phpcms attachment.class.php路径,解决phpcms上传不了图片的方法
- 2017.9.5 能量采集 思考记录
- java 校验的接口中的字符必须是半角的_初识Java,笔记1
- 哲理故事300篇 下
- 大型系统集成项目流程方案设计图
- 计算机基础中英文打字,中英文打字
- Regular DLL
- Mybatis-Plus入门案例、以及为什么不建议使用MP?
- sigmoid代码实现
- windows 快捷键
- Element 单元格合计(多行合计、合计列合并)
- 【Xilinx DMA SG】Xilinx DMA SG 模式
- boa linux arm修改网卡,Boa服务器在ARM+Linux上的移植
热门文章
- Wince 添加中文字库
- python的time库有哪些方法_Python的time模块中的常用方法整理
- echart 数据视图_关于数据可视化图表的制作,你需要关注的30个小技巧
- springboot整合elasticJob实战(纯代码开发三种任务类型用法)以及分片系统,事件追踪详解...
- 写一个函数返回参数二进制中 1 的个数
- JAVA架构师面试题and如何成为架构师
- ORA-03001,GATHER_TABLE_STATS数据库自动收集统计信息报错
- 算法学习-求两个整数的最大公约数
- php拆分数字字符串方法
- 10.4-全栈Java笔记:常用流详解(二)