字符串中连续出现最多的子串 & 字符串中最长反复子串
字符串中连续出现最多的子串 & 字符串中最长反复子串
字符串中连续出现最多的子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑P156;后缀数组就是定义一个数组指针,分别指向字符串中的相应位置,例如以下:
a b c a b c a b c d e .substr[0]
b c a b c a b c d e ....substr[1]
c a b c a b c d e .......substr[2]
a b c a b c d e ..........substr[3]
b c a b c d e .............substr[4]
c a b c d e ...............substr[5]
a b c d e .................substr[6]
b c d e ...................substr[7]
c d e .....................substr[8]
d e ........................substr[9]
e ..........................substr[10]
上面的 substr 就是abcabcabcde的后缀数组;
一、字符串中连续出现最多的子串
<span style="font-size:18px;">string MaxTimesOfContinue(string str)
{
int len = str.length();
int maxCount = 0;
string longest = "";
for (int i = 0; i < len; ++i)
{
for (int j = i + 1; j < len; ++j)
{
if (str.substr(i, j - i) == str.substr(j, j - i))
{
int offset = j - i;
int count = 2;
for (int k = j + offset; j <= len; k += offset)
{
if (str.substr(i, offset) == str.substr(k, offset))
++count;
else
break;
}
if (count > maxCount)
{
maxCount = count;
longest = str.substr(i, offset);
}
}
}
}
return longest;
}</span>
二、字符串中最长反复子串
这个问题相同能够用后缀数组的思想来做,当然開始肯定想到的是暴力法,即求全部反复子串的长度,之后选择一个最长的就可以。
int Comlen(char *str1, char *str2)
{
int i = 0;
while(*str2 && (*str1++ == *str2++))
++i;
return i;
} int MaxLength(char *str)
{
if(str == NULL)
return 0;
int maxLen = 0;
int n = strlen(str);
int maxi, maxj;
for (int i = 0; i < n; ++i)
{
for(int j = i + 1; j < n; ++j)
{
int thisLen = 0;
if ((thisLen = Comlen(&str[i], &str[j])) > maxLen)
{
maxLen = thisLen;
maxi = i;
maxj = j;
}
}
}
return maxLen;
}
a[1]:anana
a[2]:nana
a[3]:ana
a[4]:na
a[5]:a
将后缀数组按字典排序
a[0]:a
a[1]:ana
a[2]:anana
a[3]:banana
a[4]:na
a[5]:nana
之后比較相邻两个子串就可以:
int Comlen(char *str1, char *str2)
{
int i = 0;
while(*str2 && (*str1++ == *str2++))
++i;
return i;
}
int Pstrcmp(const void *a, const void *b)
{
return strcmp(*(char**)a, *(char**)b);
}
//char *a[11];
int MaxLength(char *str)
{
if(str == NULL)
return 0;
int maxLen = 0;
int len = strlen(str);
char **a = new char *[len + 1];
for (int i = 0; i < len ; ++i)
a[i] = &str[i];
qsort(a, len , sizeof(char *), Pstrcmp);
for (int i = 0; i < len - 1; ++i)
if(Comlen(a[i], a[i+1]) > maxLen)
maxLen = Comlen(a[i], a[i+1]);
return maxLen;
}
字符串中连续出现最多的子串 & 字符串中最长反复子串的更多相关文章
- POJ 1743 Musical Theme 后缀数组 不可重叠最长反复子串
二分长度k 长度大于等于k的分成一组 每组sa最大的和最小的距离大于k 说明可行 #include <cstdio> #include <cstring> #include & ...
- POJ 3294 n个串中至少一半的串共享的最长公共子串
Life Forms Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 12484 Accepted: 3502 Descr ...
- [算法练习]最长公共子串(LCS)
题目说明: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.比如"bab"和"caba"的最长公共子串是"ba"和" ...
- 利用后缀数组(suffix array)求最长公共子串(longest common substring)
摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...
- SPOJ1811最长公共子串问题(后缀自动机)
题目:http://www.spoj.com/problems/LCS/ 题意:给两个串A和B,求这两个串的最长公共子串. 分析:其实本题用后缀数组的DC3已经能很好的解决,这里我们来说说利用后缀自动 ...
- 《程序员代码面试指南》第五章 字符串问题 去掉字符串中连续出现k 个0 的子串
题目 去掉字符串中连续出现k 个0 的子串 java代码 package com.lizhouwei.chapter5; /** * @Description: 去掉字符串中连续出现k 个0 的子串 ...
- 字符串问题----去掉字符串中连续出现K个0的子串
去掉字符串中连续出现K个0的子串 给定一个字符串str,和一个整数k, 如果str中正好有连续K 个'0'字符出现,把连续的 k 个 '0'去掉,返回处理后的子串. [解题思路] 1. 定义两个变量, ...
- [算法]去掉字符串中连续出现的k个0子串
题目: 给定一个字符串str和一个整数k,如果str中正好有k个‘0’字符出现时,把k个连续的‘0’字符去除,返回处理后的字符串. 举例: str=”A00B”,k=2,返回“AB” str=”A00 ...
- 字符串s中从第i个位置起取长度为len的子串,函数返回子串链表
/*已知字符串采用带结点的链式存储结构(详见linksrting.h文件),请编写函数linkstring substring(linkstring s,int i,int len),在字符串s中从第 ...
随机推荐
- CSS BFC学习笔记
BFC,全称是Block Formatting Context,块级格式化上下文. 详细是什么,能够理解为页面元素的一种特性.触发了BFC的元素往往会产生一些对刚開始学习的人而言意想不到的效果. 触发 ...
- [ES6] Proxy & Reflect
Proxy and Reflect API works nicely together. About how to use Proxy, check this post. Let's see abou ...
- 安卓系统底层C语言算法之測试參数是几个long型的算法
#include <stdio.h> #define BITS_PER_LONG (sizeof(unsigned long) * 8) //求一个数x是几个long的长度 #define ...
- [UVALive 6661 Equal Sum Sets] (dfs 或 dp)
题意: 求从不超过 N 的正整数其中选取 K 个不同的数字,组成和为 S 的方法数. 1 <= N <= 20 1 <= K<= 10 1 <= S <= 15 ...
- angularjs1-1
<!DOCTYPE html> <html> <body> <header> <meta http-equiv="Content-Typ ...
- Visual Studio2013下Magick++配置方法
声明:本文系作者原创,如需转载请保持文章完整并注明出处(http://blog.csdn.net/u010281174/article/details/52224829). ImageMagick是一 ...
- POJ 3233 矩阵快速幂&二分
题意: 给你一个n*n的矩阵 让你求S: 思路: 只知道矩阵快速幂 然后nlogn递推是会TLE的. 所以呢 要把那个n换成log 那这个怎么搞呢 二分! 当k为偶数时: 当k为奇数时: 就按照这么搞 ...
- 移动端 | Vue.js对比微信小程序基础语法
(1)vue 自定义组件与父组件的通信,props:[abb],可以看成自组建的一个自定义属性 (2)vue 模版语法{{}} 只能是在DOM中插入,<div>{{acc}}</di ...
- P2216 [HAOI2007]理想的正方形(二维RMQ)
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...
- Excel导入到DataTable ,DataTable导入到Excel
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS. ...