字符串中的最长重复字串

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

 

/* 求一个字符串中的最长重复字串 基本思路是利用next数组来实现

 

   next数组的定义 就是 字符串中第J个字符 必有next[J] - 1个重复

 

   字串, 事实上 KMP查找  求模式串next数组  就是指求出模式串J个

 

   字符前 最大的重复子串

 

*/

 

#include <stdio.h>

 

#include <stdlib.h>

 

#include <string.h>

 

#include <malloc.h>

 

 

 

#define __in

 

#define __out

 

#define __in__out

 

#define __DEBUG__XU

 

 

 

typedef struct __MAX_SUB

 

{

 

int start;

 

int len;

 

int tempstart;

 

int templen;

 

}MAX_SUB, *PMAX_SUB;

 

 

 

int GetNext(__out int *next, __in char *substring);

 

 

 

int main(int argc, char **argv)

 

{

 

char *string = "ccccabababab";

 

char *substring;

 

unsigned int len, sublen;

 

int *next;

 

int i;

int flag = 0;

 

#ifdef __DEBUG__XU

 

int j;

 

#endif

 

MAX_SUB maxsub = {0};

 

 

 

len = strlen(string);

 

for(i = 1; i < len; i++)

{

if(string[i] != string[0])

{

flag = 1;

break;

}

}

if(!flag)

{

printf("string has only one sort of char/n");

printf("%s", string);

return 0;

}

for(i = 0; i < len; i++)

 

{

 

#ifdef __DEBUG__XU

 

printf("substring first pos: %d/n", i);

 

#endif

 

substring = string + i;

 

sublen = strlen(substring);

 

next = (int *)malloc(sizeof(int) * (sublen + 1));

 

maxsub.templen = GetNext(next, substring);

 

maxsub.tempstart = i;

 

if(maxsub.templen > maxsub.len)

 

{

 

maxsub.len = maxsub.templen;

 

maxsub.start = maxsub.tempstart;

 

}

 

#ifdef __DEBUG__XU

 

for(j = maxsub.start; j < maxsub.len + maxsub.start; j++)

 

{

 

printf("%c", string[j]);

 

}

 

printf("/n");

 

#endif 

 

free(next);

 

}

 

}

 

 

 

int GetNext(__out int *next, __in char *substring)

 

{

 

char *string;

 

int k, i;

 

int max_k;

 

 

 

string = substring;

 

next[0] = -1;

 

k = next[0];

 

i = 0;

 

max_k = k;

 

while(i < strlen(substring))

 

{

if(i + 1 == strlen(substring) )

{

if(substring[k] == substring[i])

goto kmp;

 

}

 

if(-1 == k || substring[k] == substring[i])

 

{

kmp:

i++;

 

k++;

 

next[i] = k;

 

if (k > max_k)

 

{

 

max_k = k;

 

}

 

}

 

else

 

{

 

k = next[k];

 

}

 

}

 

#ifdef __DEBUG__XU

 

for(i = 0; i < strlen(substring) + 1; i++)

 

{

 

printf("next[%d] = %d  ", i, next[i]);

 

}

 

printf("/n");

 

getchar();

 

#endif

 

return max_k;

 

}

 

最长重复子串(Rabin-Karp算法) 目录 最长重复子串 C++代码 最长重复子串 1044. 最长重复子串 给出一个字符串S,考虑其所有重复子串(S的连续子串,出现两次或多次,可能会有重叠)。 返回任何具有最长可能长度的重复子串。(如果S不含重复子串,那么答案为""。) 示例 1: 输入:"banana" 输出:"ana" 示例 2: 输入:"abcd" 输出:"" 提示: 2 <= S.length <= 10^5 S由小写英文字母组成。 方法一:二分查找 + Rabin-K... 阅读详情

相关推荐

最长重复字串和两字符串最长公子子串问题

int getNext(char *str,int *next) { int len=strlen(str); int index=0; int k=-1; next[0]=k; int max=0; //kmp算法求next值,取得最大的字串 while (indexmax)//求得其中重复最大的字串的个数,也就是与最前面串的重复数 { max=k; } } else k=next[k]; } return max

wind的专栏 2378

字符串中的最长重复

打印出一个字符串中的最长的一个重复子串,并打印出重复的位置。

字符串中无重复最长字串的长度

题目来自LeetCode算法题,难度为中等,解法参考了全站排名 16251的pinku-2大神,废话不多说,下面是干货。 Ps:因为本人是学C++的,所以以后的解法都会用C++或C语言,以后就不再多说了。 题目 给定一个string类型的字符串,请你找出其中不含有重复字符的 最长子串 的长度。 如:给定字符串 “abcbdef” ,其中最长字串是"bdef",那么输出就为4; 嵌套for循环的方法...

Kunger_best的博客 1214

求串中最长重复子串。

通过C++方法实现串中最大重复子串 初始设子串起始位置index=0,最长重复子串长度length=0。设S=“s1s2…sn”,扫描串S,对于当前字符s_i,判定其后是否有相同字符,若有记为s_j,再判定s_(i+1)是否等于s_(j+1),…,依次比较下去,即找到一个重复子串,把其下标index1与长度length1记下来,保留较长字串的index和length。再从s_(i+length1)之后找重复子串,然后对于s_(i+1)之后的字符采用相同的方法,最后的index与length即记录下最长重复子串的下表与长度。

最长重复字串

首先这是一个单字符串问题。子字符串R 在字符串L 中至少出现两次,则称R 是L 的重复子串。重复子串又分为可重叠重复子串和不可重叠重复子串,这里只是简单讨论最长可重叠的重复子串,给出基本算法和基于后缀数组的算法;关于后缀数组,这里也只是用最简单的形式实现,对于后缀数组的倍增算法和DC3算法的实现以及不可重叠重复子串的问题可参见算法合集之《后缀数组——处理字符串的有力工具》,以后再整理这几个问题。

继续微笑lsj 1636

找出最大长度重复字符串

闲话不多说了,写了一个简单的查找算法,就是找出最大长度重复字符串,或者说找出规律字符串等待之类的,都是这个意思。题目如下: 问题比较easy,就不多啰嗦,说下思路,直接上代码! 思路:重复次数肯定和长度相关的,比如长度为14 ,那么重复的只能是1,2,7,14个字符长度的字符串,对比其他的并没有意义 方法:字符串长度求余,字符串分割对比,递归循环,直到找到最长字符串 代码如下,几乎每行都注释了,老铁们应该看得懂,感觉还行的话,关注下撒!点个赞也可以的哟~ import org...

zsah2011的博客 1944

寻找字符串最长重复子串----求特征向量N法

字符串最长子串及其起始位置

Bingyeshinvwang的博客 749

输入一行字符串,找出其中重复出现且最长字符串,输出它及其首字符的位置

1、问题        输入一行字符串,找出其中出现的相同且长度最长字符串,输出它。   2、解析        例如“yyabcdabjcabceg”,输出应该为abc和3。        可以将字符串yyabcdabjcabceg分解成如下子串        yyabcdabjcabceg        yabcdabjcabceg    

梦想庚远 5540

字符串重复出现的最长字串

字符串重复出现的最长字串 例如字符串:drgabcifrabcsdrrs中,最长公共字串是:abc 方法:利用后缀树来求。 字符串的后缀树有如下: drgabcifrabcsdrrs rgabcifrabcsdrrs gabcifrabcsdrrs abcifrabcsdrrs---------s1 .............. rabcsdrrs abcsdrrs----...

fanzitao的专栏 2141

字符串最长重复字串

假设有一个字符串“abcdebfgh” 那么最长重复字串是"cdebfgh",长度是7 解题思路: 1、用一个二维数组 bits[26][2],存储每个字符ch('a'-'z')的信息。bits[ch-'a'][0]的值为0表示ch在字符串中还没有出现,为1表示已经出现过,bits[ch-'a'][1]存储字符ch在字符串中出现的位置; 2、maxLen记录最长重复字串长度,初始为0;

lskyne的专栏 3074

字符串最长重复字串

int longestSubstring(string A, int n) { map&lt;char, int&gt; m; //表示字符串中每个字符是否出现,初始化为0,表示未出现 int start = 1,MAX = 0; //遍历该字符串,每遍历一个字母时,利用map去找该字母最近一次出现是什么时候 //中间这一段便是无重复字...

asdasdasdasasd1111的博客 523

字符串中找出连续最长的数字字符串的实例代码

介绍了字符串中找出连续最长的数字字符串的实例代码,有需要的朋友可以参考一下

求一个字符串最长重复字串问题

给定一个字符串,求出这个字符串最长重复字串,例如abcdbcd,最长重复字串是bcd。 分析: 方法1:   一种方法是先解决http://blog.csdn.net/bertzhang/article/details/7303010的问题,在对字符串进行循环处理。 具体过程如下: 1)首先解决两个字符串最长公共邻接子串问题; 2)将字符串,abcdbcd分成如下两个字符串的集合:

bertzhang的专栏 2923

重复字符串最长字串解题思路

重复字符串最长字串思路 首先,头指针start的含义是:如果字符串中出现某个字符重复,start便后移至上一次出现这个字符的后面一位,字典中此字符对应的value也会更新为当前字符的索引,总之,保持[start,i]中不存在重复字符,对应下文的: else: if dic[cur] + 1 > start: start = dic[cur] + 1 dic[...

dsz_z_q的博客 249

13.找到字符串最长重复字符串字串

13.找到字符串最长重复字符串字串 题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。 输入 [2,3,4,5] 返回值 4 输入 [2,2,3,4,3] 返回值 3 分析 1.本来我是想使用Set方法,因为Set,不允许重复,自然而然就去掉重复的了,然后在调用size()方法获取大小即可,给出的样例通过了,不能完全通过 2.我就换了个LinkedList, 3.removeFirst();返回出现一次的字符串 4.然后add();将只出现一次的添

qq_45874107的博客 2090

字符串重复出现的最长字串-后缀树思想

/* 字符串重复出现的最长字串MaxlenRepeatSubString.cpp shanghai zilaishui laizi haishanghai output:shanghai @author arhaiyun date:2013/09/23 */ #include "stdafx.h" #include #include #include #include #include

arhaiyun的专栏 1085

【算法剖析】求字符串中无重复字符的最长字串

1、问题描述   这个问题来自leetcode中的Longest Substring Without Repeating Characters,诚如标题所述,我们需要寻找的是在一个字符串中,没有重复字符的最长字串。我们假定字符串中的字符只由$a$~$z$这26个字符构成。例如,对于字符串"$abcabcbb$",它的无重复字符最长字串是"$abc$",长度为3;对于字符串"$bbbb$...

UFO2260676427的博客 379

重复字符串最长字串

重复字符的最长子串 难度 中等 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。 示例 3: 输入: “pwwkew” 输出: 3 解释: 因为...

lvjiwei001的博客 165

leetcode[3]无重复字符串最长字串

leetcode[3]无重复字符串最长字串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度 如: 输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3 /** * @param {string} s * @return {number} */ var lengthOfLongestSubstring = function(s) { //创建一个哈希集合,来记录每个字符是否出现过 const occ=new

weixin_43788627的博客 153
上一篇: autoit 修复
下一篇: python 稀疏数组的处理
dalixux
博客等级 码龄18年 8粉丝 21原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值