找出字串的最长重复子串
来源:互联网 发布:如何做金融投资 知乎 编辑:程序博客网 时间:2024/06/05 17:37
一个长度为10000的字符串,写一个算法,找出最长的重复子串,如abczzacbca,结果是bc。
提示:此题是后缀树/数组的典型应用,即是求后缀数组的height[]的最大值。
#include <stdio.h>#include <stdlib.h>#define SIZE 5000char str[SIZE], *pstr[SIZE];int cmpLen(char* p, char* q) {int len = 0;while (*p && *(p++) == *(q++)) {len++;}return len;}int pstrcmp(char* p, char* q) {return strcmp(*(char* const *) p, *(char* const *) q);}//初始化尾序数组void initRearArray(char* src) {int i = 0;while (*(src + i)) {pstr[i] = &str[i];str[i] = *(src + i);i++;}str[i] = '\0';}//找出最大重复子串char* findMaxRepeatStr() {int len = strlen(str);int j = 0;int maxLen = 0, maxId = 0;int temp = 0;for (j = 0; j < len - 1; ++j) {if ((temp = cmpLen(pstr[j], pstr[j + 1])) > maxLen) {maxId = j;maxLen = temp;}}//截取子串char* result = calloc(sizeof(char), maxLen + 1);char* selectedStr = pstr[maxId];for (j = 0; j < maxLen; j++) {result[j] = *(selectedStr + j);}result[j] = '\0';return result;}int main(void) {char* src = "abcazzacbczacbc";initRearArray(src);//按字典序对字符串指针数组快排qsort(pstr, strlen(str), sizeof(char*), pstrcmp);printf("最大重复子串:");puts(findMaxRepeatStr());return EXIT_SUCCESS;}
0 0
- 找出字串的最长重复子串
- 237 找出最长的重复子串
- 找出字符串的最长不重复子串
- 找出字符串的最长不重复子串,输出长度
- 找出字符串的最长不重复子串,输出长度
- 找出字符串的最长不重复子串,输出长度
- 找出最长无重复子串
- 算法的经典问题,求最长回文子串,最长重复字串
- 字符串中找出连续最长的数字子串,并返回这个数字串的长度
- 重复子串问题(四):求两个字符串的最长公共字串
- 找出一个字符串中不含重复字符的最长子字符串
- 找出所有最长连续重复子串及其个数
- 找出所有最长连续重复子串及其个数
- 找出字符串最长不重复子串,输出长度
- java 找出所有最长连续重复子串及其个数
- 找出一个字符串中出现的重复的最长的字符子串
- 找出字符串中最长的一段没有重复字符的子串
- 找出字符串中最长的重复子串(三种解法)
- shell使用笔记
- POJ - 3280 Cheapest Palindrome
- Java——StringBuffer和StringBuilder
- hdu -Monkey and Banana
- Java内存模型——锁
- 找出字串的最长重复子串
- IIS下虚拟目录或应用程序不继承根web.config的解决方法
- java基础回顾加强
- Mybatis接口在service注入失败的解决办法
- QT creator源码分析 ----点击search后的动作
- C++中std::string::find_last_of用法
- not a regular file问题
- CentOS7.3安装VirtualBox
- 1.Linux基本概念及操作