编程珠玑(四)求一个字符串中连续出现的次数最多的子串

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

这个题目不是编程珠玑上看到的,但是解法用到的数据结构在编程珠玑上有讲到,先归类到这里。

求一个字符串中连续出现的次数最多的子串。例如字符串“abababc”,最多连续出现的为ab,连续出现三次。要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab。两个题目的解法有些类似,都用到了后缀数组这个数据结构。求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为:
abababc
bababc
ababc
babc
abc
bc
c
可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab。可以看出规律来,一个字符串s,如果第一次出现在后缀数组i的前面,那么如果它重复出现,下一次出现应该在第i+len(s)个后缀数组的前面。这个规律也不难看出。那么从头到尾按照这个规律搜索下不难得出结果。下面是代码:

#include <iostream>
using namespace std;

int con_sub(char *str, char **ret);

int main()
{
        char str[] = "abcabcabcabcabcabbbb";
        char *ret = NULL;
        int time = con_sub(str, &ret);
        printf("%s occuers %d times\n", ret, time);
        return 0;
}

int con_sub(char *str, char **ret)
{
        int max_time = 0;//连续出现的最多次数
        int ret_len = 0;//连续出现的字符串的长度
        char *addr = NULL;//连续出现字符串的起始地址

        int len = strlen(str);
        char **a = (char **)malloc(sizeof(char *)*len);
        //生成后缀数组
        for(int i=0; i<len; i++)
                a[i] = &str[i];

        //重复字符串的长度范围为1到(len+1)/2
        for(int i=1; i<=(len+1)/2; i++)
        {
                //当重复的字符串长度为i的时候,如果是连续出现的,那么第j和第j+i个后缀数组前面为重复的字符串
                for(int j=0; j+i<=len-1; j+=i)
                {
                        int k = j;
                        int temp_time = 1;
                        while(k+i <= len-1 && strncmp(a[k], a[k+i], i) == 0)
                        {
                                temp_time++;
                                k += i;
                        }
                        if(temp_time > max_time)
                        {
                                max_time = temp_time;
                                ret_len = i;
                                addr = a[k];
                        }
                }
        }
        *ret = new char[len+1];
        strncpy(*ret, addr, ret_len);
        return max_time;
}


 

程序员面试宝典-一个字符串连续出现次数最多子串 程序员面试宝典-一个字符串连续出现次数最多子串 一个字符串连续出现次数最多子串 题目 题目:一个字符串连续出现次数最多子串, 请给出分析和代码。 这里首先要搞清楚子串的概念, 1个字符当然也算字串, 注意看题目, 是连续 出现次数最多子串。 如果字符串是abcbcbcabc, 这个连续出现次数最多子串是bc, 连续 出现次数为3次。 如果类似于abcccabc, 阅读详情

相关推荐

找出一个字符串中出现次数最多的子字符串,并返回重复次数

找出一个字符串中出现次数最多的子字符串,并返回重复次数。使用java编写

一个字符串连续出现次数最多子串

分析:一个字符也算是字串,然而这是连续最多子串,abcbcbc,出现最多的为bc,连续出现3次,而如果是abcaaaaa,则a是出现次数最多的,次数为5. 可以首先逐个子串扫描来记录每个子串出现的次数。如:abc字符串,对应的子串为abc/bc/c,各出现一次,然后再逐渐缩小字符串来得出正确的结果。 代码如下: #include "stdafx.h"#include &lt;iostre...

weixin_34234829的博客 198

一个字符串连续出现次数最多子串

题目:一个字符串出现次数最多子串

KEEP PERFECTING MYSELF 1217

字符串连续出现最多子串 & 字符串中最长重复子串

字符串连续出现最多子串 & 字符串中最长重复子串     字符串连续出现最多子串 & 字符串中最长重复子串,这两个问题都可以用后缀数组来表示,至于后缀数组可以参考编程珠玑P156;后缀数组就是定义一个数组指针,分别指向字符串中的对应位置,如下: a b c a b c a b c d e .substr[0] b c a b c a b c d e ....subst

六道的专栏 4217

字符串连续出现最多子串 & 字符串中最长反复子串

字符串连续出现最多子串 & 字符串中最长反复子串 字符串连续出现最多子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑P156;后缀数组就是定义一个数组指针,分别指向字符串中的相应位置,例如以下: a b ca b c a b c d e .substr[0] b c a b c a...

weixin_30247781的博客 161

最多字符串.md

这个题目不是编程珠玑上看到的,但是解法用到的数据结构编程珠玑上有讲到,先归类到这里。 一个字符串连续出现的次数最多子串。例如字符串“abababc”,最多连续出现的为ab,连续出现三次。要和一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab。两个题目的解法有些类似,都用到了后缀数组这个数据结构一个字符串连续出现的次数最多子串,首先生成后缀数组例如上

我们的征途是星辰大海 366

编程珠玑混搭

感觉编程珠玑写的很好,但是书上写的不尽详细,仿佛如“高手过招,点到为止”,网上查些资料,加上自己的领悟,写写呗。 第一章:参照:http://chaoswork.com/blog/2012/05/18/programming-pearls-study-note-1/ 1.4.如何生成位于0到n-1之间的k个不同的随机顺序的随机整数? Idea1:用set行,主要是set里面的元素不重复,

瀚海一叶 1012

编程珠玑--旋转算法

编程珠玑--旋转算法 2010-11-16 07:55 by 轩脉刃, ... 阅读, ... 评论, 收藏, 编辑 旋转算法出自《编程珠玑》第二章题目。 《编程珠玑》一书对算法是极度推崇,这点意识在我们看书的时候每每都有被灌输。使用一种好的算法往往能使得程序更加漂亮,也很能带给我们程序员某种满足感。 题目:将一个n...

轩脉刃的刀光剑影 140

查找一段文字中最长的重复字串 – 编程珠玑(排过序的后缀数组的应用)

查找一段文字中最长的重复字串 – 编程珠玑(排过序的后缀数组的应用) 分类: 算法2012-08-16 22:12 164人阅读 评论(0) 收藏 举报 编程算法blog 转自:https://www.cse.msu.edu/~liyang5/?p=53 《编程珠玑》在第15章“珍珠字符串”一节,给出了一个非常漂亮的实现 – 基于目标字符串

pi9nc的专栏 714

编程珠玑(二)寻找一个字符串中最长重复字串

例如字符串"banana"中最长重复字串为ana,这里用到了一个很简单的数据结构字符串数组,其实为一个字符串指针数组,一个char *类型的数组,用字符地址代表每个字符,可以节省空间。算法很简单,出每个后缀数组,然后对后缀数组进行排序,最后出相邻的两个数组之间的最大公共字串。 #include using namespace std; void common_str(char *s

胜利者的经验并不复杂,那就是寻找人生的关键点,并在关键时刻竭尽全力 1237

编程珠玑: 15章 字符串 15.2寻找字符串中的最长重复子串 -------解题总结

#include #include #include #include //qsort using namespace std; /* 问题:给定一个文本文件作为输入,查找其中最长的重复子字符串。例如,“Ask not what your country can do for you, but what you can do for your country”中 最长的重复字符串是"ca

qingyuanluofeng的专栏 1962

利用后缀数组字符串中的最长公共字串——编程珠玑15章

<br />#include "stdafx.h" #include <iostream> #include <algorithm> using namespace std; /************************************************************************/ //函数功能:字符串str1和str2的公共序列的长度 /*********************************************************

wangyangkobe的专栏 1135
上一篇: 设计模式(五)策略模式(Strategy Pattern)
下一篇: 设计模式(六)外观模式(Facade Pattern)
ysu108
博客等级 码龄16年 246粉丝 206原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值