连续出现次数最多的子串—后缀数组

2024-06-18 13:18

本文主要是介绍连续出现次数最多的子串—后缀数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  http://blog.csdn.net/ysu108/article/details/7795479 讲解

  http://blog.csdn.net/imcdragon/article/details/6838565 代码

  面试宝典P237

 
基本算法描述:
例如字符串“abababc”,最多连续出现的为ab,连续出现三次。

要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab。


求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为:
abababc
bababc
ababc
babc
abc
bc
c
可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab。

可以看出规律来,一个字符串s,如果第一次出现在后缀数组i的前面,那么如果它重复出现,下一次出现应该在第i+len(s)个后缀数组的前面。

这个规律也不难看出。那么从头到尾按照这个规律搜索下不难得出结果

#include <iostream>
#include <string>
#include <vector>
#include <utility>
using namespace std;pair<int, string> fun(const string &str)
{vector<string> substrs;int maxcount = 1, count = 1;string substr;int i, len = str.length();for(i=0; i<len; ++i)/*生成后缀数组*/substrs.push_back(str.substr(i, len-i));		/*for(i=0; i<len; ++i)cout << substrs[i] << endl;*/for(i=0; i<len; ++i){	for(int j=i+1; j<len; ++j){count = 1;//当重复的字符串长度为(j-i)的时候,如果是连续出现的,//那么第j和第j+(j-i),j+2*(j-i)...个后缀数组前面为重复的字符串if(substrs[i].substr(0, j-i) == substrs[j].substr(0,j-i)){++count;for(int k=j+(j-i); k<len; k+=j-i)	{	//如果是连续出现的,那么第j和第j+(j-i),j+2*(j-i)...个后缀数组前面为重复的字符串if (substrs[i].substr(0,j-i) == substrs[k].substr(0, j-i))++count;elsebreak;}if(count > maxcount){maxcount = count;substr=substrs[i].substr(0, j-i);}}}}return make_pair(maxcount, substr);
}int main()
{pair<int, string> rs;string str="abcabcabcabcabcabbbb";rs = fun(str);cout << rs.second<<':'<<rs.first<<'\n';system("pause");return 0;
} 



              

这篇关于连续出现次数最多的子串—后缀数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1072099

相关文章

剑指offer(C++)--数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution {public:void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {int len = data.size();if(len<2)return;int one = 0;for(int i

AI学习指南机器学习篇-朴素贝叶斯处理连续特征和离散特征

AI学习指南机器学习篇-朴素贝叶斯处理连续特征和离散特征 在机器学习领域,朴素贝叶斯是一种常用的分类算法,它的简单性和高效性使得它在实际应用中得到了广泛的应用。然而,在使用朴素贝叶斯算法进行分类时,我们通常会面临一个重要的问题,就是如何处理连续特征和离散特征。因为朴素贝叶斯算法基于特征的条件独立性假设,所以对于不同类型的特征,我们需要采取不同的处理方式。 在本篇博客中,我们将探讨如何有效地处理

IOS 数组去重的几种方式

本来只知道NSSet和KeyValues的。今天又新学了几种方式 还有就是和同事学的一种方式 外层循环从0开始遍历,内层从最后一个元素开始遍历 for(int i=0;i<index;i++){  for(int j=index-1;j>i;j-- ){ } }

Java基础(二)——数组,方法,方法重载

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 + TS + Pinia + Element Plus + Spring全家桶 + MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步至千里,积小流成江海 🥇推荐学习:🍖开源 rich-vue3 🍍前端面试

poj 3882(Stammering Aliens) 后缀数组 或者 hash

后缀数组:  构建后缀数组,注意要在字符串莫末尾加上一个没出现过的字符。然后可以2分或者直接扫描,直接扫描需要用单调队列来维护 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string

poj 3294(Life Forms) 2分+ 后缀数组

我曾用字符串hash写,但是超时了。只能用后最数组了。大致思路:用不同的符号吧字符串连接起来,构建后缀数组,然后2分答案,依次扫描后缀数组,看是否瞒住条件。 VIEW CODE #include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<cstring>#include<cassert>#

C语言函数参数--数组长度

int read_column_numbers(int columns[], int max){} 在函数声明的数组参数中,并未指定数组的长度。这种格式是OK的,因为无论调用函数的程序传递给它的数组参数的长度是多少,这个函数都将照收不误。 这是一个伟大的特性,它允许单个函数操纵任意长度的一维数组。 这个特性不利的一面是函数没法知道该数组的长度。如果确实需要数组的长度,它的值必须作为一个单独的

从JavaScript 数组去重看兼容性问题,及性能优化(摘自玉伯博客)

缘由 JavaScript 数组去重经常出现在前端招聘的笔试题里,比如: 有数组 var arr = ['a', 'b', 'c', '1', 0, 'c', 1, '', 1, 0],请用 JavaScript 实现去重函数 unqiue,使得 unique(arr) 返回 ['a', 'b', 'c', '1', 0, 1, ''] 作为笔试题,考点有二: 正确。别小看这个考点

【Java】ArrayListString转化为String数组问题

Java的容器类Collections中toArray()方法,可以把诸如ArrayList<String>的动态数组、不定长转化静态数组、定长数组String[] 但是,如下的转化方式是错误的。 [java]  view plain copy String[] strArray = (String[]) arrayList.toArray();   如果这样执行会导致

数组 (java)

文章目录 一维数组静态初始化动态初始化 二维数组静态初始化动态初始化 数组参数传递可变参数关于 main 方法的形参 argsArray 工具类sort 中的 comparable 和 comparatorcomparator 比较器排序comparable 自然排序 一维数组 线性结构 静态初始化 第一种:int[] arr = {1,2,3,4},第二种:int[]