字符串中连续出现最多的子串 & 字符串中最长反复子串
字符串中连续出现最多的子串 & 字符串中最长反复子串
字符串中连续出现最多的子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑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中从第 ...
随机推荐
- [using_microsoft_infopath_2010]Chapter 11 创建审批流程
本章概要: 1.为审批者创建一个简单的界面 2.设置表单加载规则切换视图 3.创建多审批小结表单 4.为已经完成的表单创建只读视图 5.创建工作流为每个审批阶段发送EMAIL
- 剑指Offer读书笔记(持续更新中)
(1)定义一个空的类型,里面没有不论什么成员变量和成员函数,对该类型求sizeof,得到的结果是多少? 答案是1.空类型的实例中不包括不论什么信息,本来求sizeof应该是0,可是当我们声明该类型实例 ...
- 【jQuery】对于复选框操作的attr与prop
这个是在jQuery1.6版本号之后出现的鬼东西.受影响的主要有下拉列表select与复选框checkbox.众所周知.在jQuery中能够用attr()取出节点的属性,然而对于checkbox却不是 ...
- Swift-UITextField用法
文本框的创建,如下几种方式: UITextBorderStyle.None:无边框 UITextBorderStyle.Line:直线边框 UITextBorderStyle.RoundedRect: ...
- Scrapy Architecture overview--官方文档
原文地址:https://doc.scrapy.org/en/latest/topics/architecture.html This document describes the architect ...
- Swagger 隐藏具体API
一.why 在swagger ui界面中有时候不想显示某些api,通过下面的方式可以实现. 1.1.新建一个类实现IDocumentFilter接口 using Swashbuckle.Swagger ...
- SpringBoot(七) SpringBoot中的缓存机制
随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...
- Ubuntu 16.04 Go环境搭建 Go环境+Sublime配置
Ubuntu 16.04 Go环境搭建 Go环境+Sublime配置 1. 安装Go 下载地址https://golang.org/dl/ (需要翻下) 下载到类似go1.8.3.linux-amd6 ...
- JOptionPane提示框的一些常用用法
1.1 showMessageDialog 显示一个带有OK 按钮的模态对话框. 下面是几个使用showMessageDialog 的例子: JOptionPane.showMessageDialog ...
- 路飞学城Python-Day37
36-多表查询练习 37-权限管理 1.创建账号 本地账号 create user 'panda' @ 'loacalhost' inentified by'123' 远程账号 create user ...