求一个字符串中最长的非重复连续子串
2010-06-10 10:31
447 查看
如abcadacef
最长的非重复子串为dacef. maxLen = 5
最直接的方法是O(n^2)解决,匹配所有子串
改进一
改进二,算法复杂度提高到O(n)
最长的非重复子串为dacef. maxLen = 5
最直接的方法是O(n^2)解决,匹配所有子串
改进一
#include <stdio.h> #include <stdlib.h> #include <memory> #define MAX 100 int flag[26]; void getSub(char *str) { memset(flag, -1, sizeof(flag)); int tmpLen = 0; int begin = 0;//上一个子串的起始位置 int max = 0;//最长非重复子串的长度 int res_b;//最长非重复子串的起点 for(int i = 0; str[i] != '/0'; i++) { int key = str[i] - 'a'; if(flag[key] == -1) //如果当前字符从未出现过, { tmpLen++; flag[key] = i; } else { if(tmpLen > max)//如果当前的子串长度大于max { max = tmpLen; res_b = begin; } int j; for(j = begin; j < i; j++)//修正flag[]值 { if(str[j] == str[i]) { flag[key] = i; break; } else { flag[str[j]-'a'] = -1; } } begin = j + 1; tmpLen = i - j; } } if(tmpLen > max) { max = tmpLen; res_b = begin; } //输出最长的子串结果 printf("max = %d/n", max); for(int i=0; i < max; i++) printf("%c", str[i + res_b]); } int main() { char s[MAX]; scanf("%s", s); getSub(s); system("pause"); return 0; }
改进二,算法复杂度提高到O(n)
#include <stdio.h> #include <stdlib.h> #include <memory> #define MAX 100 int flag[26]; void getSub(char *str) { memset(flag, -1, sizeof(flag)); int tmpLen = 0; int begin = 0; int max = 0;//最长非重复子串的长度 int res_b;//最长非重复子串的起点 for(int i = 0; str[i] != '/0'; i++) { int key = str[i] - 'a'; if(flag[key] < begin) //如果当前字符在当前扫描子串未出现过 { tmpLen++; flag[key] = i; } else { if(tmpLen > max)//如果当前的子串长度大于max { max = tmpLen; res_b = begin; } int j; begin = flag[key] + 1;//当前子串应该从flag[key]+1开始重新计算 flag[key] = i; tmpLen = i - begin + 1;//当前无重复子串的长度为tmpLen } } if(tmpLen > max) { max = tmpLen; res_b = begin; } //输出最长的子串结果 printf("max = %d/n", max); for(int i=0; i < max; i++) printf("%c", str[i + res_b]); } int main() { char s[MAX]; while(scanf("%s", s)!=EOF) { getSub(s); printf("/n"); } system("pause"); return 0; }
相关文章推荐
- 求一个字符串的最长无重复字母的连续子串
- 用三重循环求一个字符串的最大回文串(连续重复出现的最长子串)
- 找出一个字符串中出现的重复的最长的字符子串
- 【寻找一个字符串中最长的重复子串】
- 给定一个字符串,返回字符串中没有重复字符的最长子串的长度
- 自己写的一个后缀树算法查找一个字符串的最长重复子串
- 求一个字符串中的最大连续重复子串
- 求一个字符串的最长不重复子串的最大长度
- 求一个字符串中最长连续子串
- 给定一个字符串,输出最长的重复子串
- 找出一个字符串中最长连续相同子串
- 【每日面试题】给定一个字符串,求出其最长的重复子串
- 【每天学点算法题10.17】寻找一个字符串中的最长重复子串
- 给定一个字符串,求出最长的连续配对括号子串的长度
- 寻找一个字符串中最长的重复子串
- 找出一个字符串中最长的连续数字子串,输出该字符串及长度
- 字符串操作问题:查找给定字符串中,连续重复且长度最长的第一个子串
- 重复子串问题(二):求一个字符串中连续出现次数最多的子字符串
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 字符串中连续出现最多的子串 & 字符串中最长重复子串