求给定字符串中最长重复子串
2013-09-19 00:21
381 查看
问题描述:
给定一个字符串,如abcdaaabbbaaaabcdbbb,这个串中最长重复子串为abcd;若有多个长度相等的重复子串,只需输入第一个最长的。
最直观的算法设计:
设给定的字符串为s=“a1a2a3...an”,则对任意ai,在i+1到n之间查找aj, s.t. ai=aj,用idx记下此时ai下标,即i;然后依次比较ai+1,ai+2...与aj+1, aj+2是否相同,并记下最长相等的串的长度len,若此长度大于历史最大长度,则用idx及len更新历史最优值。重复此过程,直至i>=s.length()。算法复杂度为O(n^2),应该还有改进空间吧,大家可以写下自己的思路,一起讨论。
基于以上算法,可以很容易写出C++版代码:
给定一个字符串,如abcdaaabbbaaaabcdbbb,这个串中最长重复子串为abcd;若有多个长度相等的重复子串,只需输入第一个最长的。
最直观的算法设计:
设给定的字符串为s=“a1a2a3...an”,则对任意ai,在i+1到n之间查找aj, s.t. ai=aj,用idx记下此时ai下标,即i;然后依次比较ai+1,ai+2...与aj+1, aj+2是否相同,并记下最长相等的串的长度len,若此长度大于历史最大长度,则用idx及len更新历史最优值。重复此过程,直至i>=s.length()。算法复杂度为O(n^2),应该还有改进空间吧,大家可以写下自己的思路,一起讨论。
基于以上算法,可以很容易写出C++版代码:
#include <iostream> #include <cstring> using namespace std; void printMaxDuplication(const char* src){ if(!src){ return; } int len = strlen(src); //记录最长重复子串的起始位置以及对应最长的长度 int idx=0, maxLen=0; for(int i =0; i < len; ++i){ for(int j = i+1, tempLen=0; j < len; ){ if(src[i] == src[j]){ //依次比较ai+1与aj+1。ai+2与aj+2 for(; src[j+tempLen] !='\0' && src[i+tempLen]==src[j+tempLen]; ++tempLen); if(tempLen > maxLen){ maxLen = tempLen; idx = i; } j += tempLen; }else{ ++j; } } } //print for(int i =0; i < maxLen; ++i){ cout<<src[idx+i]; } } int main(){ char src[] = "aaacdefgaaaddedefg"; printMaxDuplication(src); return 0; }
相关文章推荐
- 给定一个字符串,找到最长的子串的长度没有重复字符
- 给定一个字符串,求出其最长的重复子串。
- 给定一个字符串,求出其最长的重复子串的长度
- 每日面试题:给定一个字符串,求出其最长的重复子串
- 给定一个字符串,求出其最长的重复子串
- 给定一个字符串,输出最长的重复子串
- 给定一个字符串,求出其最长的重复子串
- 求给定的某一个字符串中的最长的没有重复字符的子串的长度
- 给定一个字符串,求出其最长的重复子串。
- 获取给定字符串最长不重复子串
- Python实现针对给定字符串寻找最长非重复子串的方法
- 给定一个字符串,返回字符串中没有重复字符的最长子串的长度
- 算法题目二:寻找最长重复子序列(4) 求给定字符串重复最长的子串
- 给定一个字符串,输出最长的重复子串
- 求给定字符串重复最长的子串
- 【每日面试题】给定一个字符串,求出其最长的重复子串
- 给定一个字符串,求出其最长的重复子串。
- 编写算法,对给定的字符串str,返回其最长重复子串及其下标位置
- leetcode第三题:求给定字符串中最长无重复子串的长度
- 字符串操作问题:查找给定字符串中,连续重复且长度最长的第一个子串