找出所有最长连续重复子串及其个数

问题描述:
找出字符串中所以最长连续重复子串及其个数
比如:
输入:123234,最大连续重复字符串为23,个数为2
输入:5555,最大连续重复字符串为555,个数为2
输入:aaabbb 最大连续重复字符串为aa,个数为2;和bb,个数为2
必须存在重复的字符串才算,只出现一次的不算。可能存在多个相同长度的不同字符串,比如aaabbb。

解题思路

[求一个字符串中连续出现次数最多的子串]的区别体现在两个方面:一是要找最长子串(重复次数大于等于2即可);二是要考虑子串是有重叠的重复,如eeee的最长子串为eee。在上一题中, 有重叠的肯定不是连续出现次数最多的。

实现代码

#include <iostream>
#include <cstring>
#include <utility>
#include <string>
#include <vector>
using namespace std;

vector<pair<int, string>> fun(const string& str)
{
    vector<string> subs;
    vector<pair<int, string>> res;
    int len = str.size();
    for (int i = 0; i < len; i++)
    {
        subs.push_back(str.substr(i));
    }

    int count = 1;
    int maxCount = 1;
    int subLen = 1;
    string sub;

    //i为子串的长度
    for (int i = 1; i < len; i++)
    {
        for (int j = 0; j < len - 1; j++)
        {
            count = 1;
            for (int k = j + 1; k <= j + i && subs[k].size() >= i; k++)
            {
                if (subs[k].substr(0, i) == subs[j].substr(0, i))
                {
                    count++;
                    break;
                }
            }
            if (count >= 2)
            {
                if (i > subLen)
                {
                    res.clear();
                }
                subLen = i;
                maxCount = count;
                sub = subs[j].substr(0, i);
                res.push_back(make_pair(maxCount, sub));
            }
        }
    }

    return res;
}

int main()
{
    string str;
    vector<pair<int, string>> res;
    while (cin>>str)
    {
        res = fun(str);
        for (auto it = res.begin(); it != res.end(); it++)
        {
            cout<<it->second<<":"<<it->first<<endl;
        }
    }

    return 0;
}
时间: 2024-12-26 20:47:43

找出所有最长连续重复子串及其个数的相关文章

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和

参考:http://www.ahathinking.com/archives/124.html 最长公共子序列 1.动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列.如果序列比较长,这种方法需要指数级时间,不切实际. LCS的最优子结构定理:设X={x1,x2,--,xm}和Y={y1,y2,--,yn}为两个序列,并设Z={z1.z2.--,zk}为X和Y的任意一个LCS,则:       (1

九度题目1530:最长不重复子串

题目1530:最长不重复子串 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:873 解决:284 题目描述: 最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的. 输入: 输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串,字符串的长度不大于10000. 输出: 对于每组测试用例,输出最大长度的不重复子串长度. 样例输入: absd abba abdffd 样例输出: 4 2 4 来源

最长不重复子串

题目1530:最长不重复子串 时间限制:1 秒内存限制:128 兆特殊判题:否提交:816 解决:263 题目描述: 最长不重复子串就是从一个字符串中找到一个连续子串,该 子串中任何两个字符都不能相同,且该子串的长度是最大的 . 输入: 输入包含多个测试用例,每组测试用例输入一行由小写英文 字符a,b,c...x,y,z组成的字符串,字符串的长度不大于 10000. 输出: 对于每组测试用例,输出最大长度的不重复子串长度. 样例输入: absd abba abdffd 样例输出: 4 2 4 来

使用T-SQL找出执行时间过长的作业

原文:使用T-SQL找出执行时间过长的作业     有些时候,有些作业遇到问题执行时间过长,因此我写了一个脚本可以根据历史记录,找出执行时间过长的作业,在监控中就可以及时发现这些作业并尽早解决,代码如下:   SELECT sj.name , sja.start_execution_date,DATEDIFF (SECOND ,sja.start_execution_date,GETDATE() ) AS ExecutedMin,ja.AvgRuntimeOnSucceed FROM msdb.

找出两个字符的最大子串

package cn.ic; //要求:找出两个字符串中的最大子串,即最大的交集.如:"udappyzk"和"xzhappymol"最大子串为appy //步骤: //1 找出两个字符串中的较短者 //2 分别将较短子串除去0,1,2,3,4--个元素,且判断除去X个元素后的子串是否在较长字符串中出现 //分析: //以题目中较短字符串"udappyzk"为例 //(1)去除0个元素的情况,有1种操作,得到本身字符串作为最大子串 //(2)去除1

最长连续公共子串算法

#include <iostream> #include <string.h> using namespace std; int GetLCSLength(char* str1, char* str2) { int length1 = strlen(str1); int length2 = strlen(str2); int maxCommonLen = 0; // 公共子串的长度 int endIndex = 0; // 公共子串的最后位置 // 申请内存 int** table

leetcode 3 Longest Substring Without Repeating Characters最长无重复子串

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest subst

求字符串中最长无重复字符的子串

题目:求一个字符串中最长的没有重复字符的子串. 方法一:穷举法,使用2重外循环遍历所有的区间,用2重内循环检验子串是否符合"无重复字符"这一要求.其中外层循环i.j 遍历所有的下标,m.n是内层循环,检查区间[i,j]是否符合要求.空间复杂度是O(1),时间复杂度O(N^4). //O(N^4)的时间复杂度 int max_unique_substring1(char * str) { int maxlen = 0; int begin = 0; int n = strlen(str)

c语言 设计一个找出同数值部分排列的程序

问题描述 c语言 设计一个找出同数值部分排列的程序 定义一行的整数的输入有相同连续的地方为"同数值部分排列"找出有最长的同数值部分排列,并输出排列长度及这个数字的程序.最长的同数值部分排列有两个以上的时候,输出最后那个.输入的数字用空格或者换行区别 例1输入:0 1 1 1 2 0 0输出:3 1 例2输入:1 1 1 31 2 223输出:3 2 解决方案 #include <stdio.h>int main(){ int x; int c = 0; int px = -