Algorithm --> 字符串中最长不重合子串长度
例子
"abmadsefadd" 最长长度为7
"avoaid" 最长长度为3
思路
空间换时间hashTable,起始位置设为beg。初始化全局最大值0。开辟字符数组,起初标为0。
访问数组时
- 如果该字符在hashTable对应的哈希值为1,则计算当前位置到beg的距离,并且把beg赋值为beg+1。如果大于全局最大值,则替换全局最大值
- 如果该字符在hashTable对应的哈希值为0,则置1
参考代码
#include <iostream>
#include <cstring>
using namespace std;
int getMaxLen2(string str)
{
int len = str.length();
int appear[256]={0};
memset(appear,-1,sizeof(appear));
int preCnt=1;
appear[str[0]]=0;
int ret = 1;
for(int i=1;i<len;++i)
{
int dif = i-appear[str[i]];
if(dif>preCnt)
{
++preCnt;
if(preCnt>ret)
{
ret = preCnt;
}
}
else
{
preCnt = dif;
}
appear[str[i]] = i;
}
return ret;
}
int getMaxLen(const string &s) //有问题,如果输入为abcbgef
{
int beg = ;
int span = ;
int maxspan = ;
int hashTable[];
for (int i = ; i < ; ++i)
hashTable[i] = ;
int lens = s.size();
for(int i = ; i < lens; ++i)
{
int index = s[i];
if (hashTable[index] == )
{
span = i - beg;
if (span > maxspan)
maxspan = span;
beg++;
}
else
{
hashTable[s[i]] = ;
}
}
return maxspan;
} int main()
{
const string a = "abmadsefadd";
const string a1 = "abcbge";
cout << getMaxLen(a) << endl;
cout << getMaxLen(a1) << endl; //错:输出为3
cout << getMaxLen2(a1) << endl; //正确:输出为4
}
结果
Algorithm --> 字符串中最长不重合子串长度的更多相关文章
- 字符串中连续出现最多的子串 & 字符串中最长反复子串
字符串中连续出现最多的子串 & 字符串中最长反复子串 字符串中连续出现最多的子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑P156:后缀 ...
- 【Java例题】5.5 两个字符串中最长公共子串
5. 查找两个字符串中含有的最长字符数的公共子串. package chapter5; import java.util.Scanner; public class demo5 { public st ...
- 【poj3294-不小于k个字符串中最长公共子串】后缀数组
1.注意每两个串之间的连接符要不一样. 2.分组的时候要注意最后一组啊!又漏了! 3.开数组要考虑连接符的数量.100010是不够的至少要101000. #include<cstdio> ...
- 基于python 3.5 所做的找出来一个字符串中最长不重复子串算法
功能:找出来一个字符串中最长不重复子串 def find_longest_no_repeat_substr(one_str): #定义一个列表用于存储非重复字符子串 res_list=[] #获得字符 ...
- python经典算法题:求字符串中最长的回文子串
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
- 7-19 计算有n个字符串中最长的字符串长度 (40 分)
编写程序,用于计算有n(1<n<10)个字符串中最长的字符串的长度.前导空格不要计算在内! 输入格式: 在第一行中输入n,接下的每行输入一个字符串 输出格式: 在一行中输出最长的字符串的长 ...
- java基础知识回顾之---java String final类普通方法的应用之“两个字符串中最大相同的子串”
/* * 3,两个字符串中最大相同的子串. * "qwerabcdtyuiop" * "xcabcdvbn" * * 思路: * 1,既然取得是最大子串,先看 ...
- 算法练习:求字符串的最长重复子串(Java实现)
1. 求字符串的最长重复子串 例如:aaaaaaaaabbbbcccaaassscvvv这里面的最长重复子串为aaaaaaaaa 算法思路:算法时间复杂度(O(n)) 1. 将这一个字符串先转成cha ...
- POJ2774 Long Long Message —— 后缀数组 两字符串的最长公共子串
题目链接:https://vjudge.net/problem/POJ-2774 Long Long Message Time Limit: 4000MS Memory Limit: 131072 ...
随机推荐
- 硬盘分区表格式GUID和MBR知识普及
我们的电脑硬盘分区格式一共有两种,一种是GUID(GPT),一种是MBR 如果你的电脑原装系统是win8或者以上的,那么他的硬盘分区表格式为GUID(GPT)格式的:如果是win7以下的,那么一般就是 ...
- spring schedule定时任务(二):配置文件的方式
接着上一篇,这里使用spring配置文件的方式生成spring定时任务. 1.相应的web.xml没有什么变化,因此便不再罗列.同样的,相应的java代码业务逻辑改动也不大,只是在原来的基础上去掉@C ...
- 引导加载程序之争: LILO 和 GRUB
在不考虑他们的工作或专业情况下,所有 Linux 用户都会使用的是哪个工具?引导加载程序.通过本文了解引导加载程序的工作原理,认识两个流行的引导加载程序 LILO(LInux LOader)和 GNU ...
- MySQL插入数据异常
MySQL插入数据异常 1.错误如下: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:Dupli ...
- Stanford Word Segmenter使用
1,下载 Stanford Word Segmenter软件包: Download Stanford Word Segmenter version 2014-06-16 2,在eclipse上建立一个 ...
- Deadlock found when trying to get lock; try restarting transaction
1.错误描述 [ERROR:]2015-06-09 16:56:19,481 [抄送失败] org.hibernate.exception.LockAcquisitionException: erro ...
- Caused by: org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 81;
1.错误描述 严重: Exception sending context initialized event to listener instance of class org.springframe ...
- Web原理
在日常学代码的过程中,总会多多少少遇到点瓶颈.但是别人又听得懂,这是为什么? 我觉得,就是在原理上都不去思考,为什么这样写?为什么一定要这样写?那到底该怎么写?写完了是怎么运行的? 就以上几个问题,只 ...
- 《用TCP/IP进行网络互连》读书笔记
<用TCP/IP进行网络互连>读书笔记 第2章,基本网络技术 网络通信分类:基于连接的通信(connection-oriented),基于非连接的通信(connectionless) ...
- svn提交代码时不要提交bulid里的内容,会报错