最大重复出现子串
来源:互联网 发布:淘宝商家投诉买家 编辑:程序博客网 时间:2024/05/22 02:19
输入一个字符串,如何求最大重复出现的字符串呢?比如输入ttabcftrgabcd,输出结果为abc, canffcancd,输出结果为can。
给定一个字符串,求出其最长的重复子串。
分析:使用后缀数组,对一个字符串生成相应的后缀数组后,然后再排序,排完序依次检测相邻的两个字符串的开头公共部分。
这样的时间复杂度为:
- 生成后缀数组 O(N)
- 排序 O(NlogN*N) 最后面的 N 是因为字符串比较也是 O(N)
- 依次检测相邻的两个字符串 O(N * N)
故最终总的时间复杂度是 O(N^2*logN)
#include <stdio.h>#include <stdlib.h>#define SIZE 10000char str[SIZE], *pstr[SIZE];int pstrcmp(char* p, char* q) {return strcmp(*(char* const *) p, *(char* const *) q);}int getCommonLen(char* p, char* q) {int len = 0;while (*p && *(p++) == *(q++)) {len++;}return len;}void initRearArr(char* src) {int len = strlen(src);int i = 0;for (i = 0; i < len; ++i) {pstr[i] = &str[i];str[i] = src[i];}str[i] = '\0';}char* getMaxRepeatSubStr() {int i = 0;int len = strlen(str);int maxLen = 0, maxId = 0;int temp = 0;for (i = 0; i < len - 1; i++) {if ((temp = getCommonLen(pstr[i], pstr[i + 1])) > maxLen) {maxLen = temp;maxId = i;}}char* p = pstr[maxId];char* result = calloc(sizeof(char), maxLen + 1);for (i = 0; i < maxLen; i++) {result[i] = *(p + i);}result[i] = '\0';return result;}int main(void) {char* src = "canffcancd";initRearArr(src);qsort(pstr, strlen(src), sizeof(char*), pstrcmp);puts("最大重复子串:");puts(getMaxRepeatSubStr());return EXIT_SUCCESS;}
0 0
- 最大重复出现子串
- POJ1961 子串重复出现最大次数
- POJ2406 子串重复出现最大次数
- 获取最大重复子串
- 最大连续重复子串
- POJ-2406 Power Strings(KMP求重复子串出现的最大次数)
- poj2406 Power Strings(最大重复子串)
- LeetCode 3 最大不重复子串
- 最大无重复字母子串
- Leetcode—最大无重复子串
- Leetcode 3 - 最大不重复子串
- 后缀数组求最大重复子串
- 用三重循环求一个字符串的最大回文串(连续重复出现的最长子串)
- 寻找最大重复子字符串
- 在一个字符串中找一个最大重复子串
- 求任意字符串最大的重复过的子串
- 求一个字符串中的最大连续重复子串
- 在一个字符串中找一个最大重复子串
- DDL数据定义语言
- 关于电脑定时关机等DOS指令
- python学习笔记(27)--类的详解8(基于类的状态机)
- Picasso封装优化
- 微服务架构
- 最大重复出现子串
- 紫书例题 10-15 杆子的排列 UVa1638
- hibernate学习笔记
- 53. Maximum Subarray
- [leetcode]136. Single Number
- 二叉查找树(二叉排序树)创建、插入、删除、查找-C语言
- 静态方法与动态方法的区别
- AutoCad.net开发(2)
- 学习笔记:Linux下编写内核模块(0)