求最长连续字串问题
2016-08-05 15:10
120 查看
注意这里讲的是连续,也就是substring,不是subsquence
我们有两个方法,动态规划和直尺法。
dp:建一个c[i][j]数组,表示在第i比较中,最长的连续长度
直尺法:
我们有两个方法,动态规划和直尺法。
dp:建一个c[i][j]数组,表示在第i比较中,最长的连续长度
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define N 500010 using namespace std; int longest_substring(char *s1,char *s2) { int i,j,k,len1,len2,max,x,y; len1=strlen(s1); len2=strlen(s2); int **c = new int*[len1+1]; for(i = 0; i < len1+1; i++) c[i] = new int[len2+1]; for(i=0;i<len1+1;i++) { c[i][0]=0; } for(j=0;j<len2+1;j++) c[0][j]=0; max=-1; for(i=1;i<len1+1;i++) { for(j=1;j<len2+1;j++) { if(s1[i-1]==s2[j-1]) { c[i][j]=c[i-1][j-1]+1; } else c[i][j]=0; if(c[i][j]>max) { max=c[i][j]; x=i; y=j; } } } char s[1000]; k=max; i=x-1,j=y-1; s[k--]='\0'; while(i>=0&&j>=0) { if(s1[i]==s2[j]) { s[k--]=s1[i]; i--,j--; } else break; } puts(s); for(i=0;i<len1+1;i++) delete[] c[i]; delete[] c; return max; } int main() { char s1[1000],s2[1000]; gets(s1); gets(s2); int len=longest_substring(s1,s2); printf("%d\n",len); return 0; }
直尺法:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define N 10010 /*直尺法:将短的一串从尾部开始进入和长的串头部比较,直到短的头部与长的尾部比较完毕 */ using namespace std; int longest_substring(char *s1,char *s2) { int i,len,len1,len2,k,s1_st,s2_st,count,max,j; len1=strlen(s1); len2=strlen(s2); len=len1+len2; max=0; for(i=0; i<len; i++) { s1_st=s2_st=0; if(i<len1) s1_st=len1-i; else s2_st=i-len1; count=0; for(j=0; (s1_st+j<len1)&&(s2_st+j<len2); j++) { if(s1[s1_st+j]==s2[s2_st+j]) count++; else { max=count>max?count:max; count=0; } } if(count>max) { max=count; k=s1_st+j-1;//公共字串在str1中的下标起始位置为k-max+1,结束位置为k } } char s[1001]; for(i=0; i<max; i++) s[i]=s1[k-max+1+i]; s[i]='\0'; puts(s); return max; } int main() { char s1[1001],s2[1001]; gets(s1); gets(s2); int ans=longest_substring(s1,s2); printf("%d\n",ans); return 0; }
相关文章推荐
- PAT 1096. Consecutive Factors (20) 最长连续因子乘积 ,素数判断, 连续乘积问题的幂优化
- 求一个字符串中最长连续字串及其长度
- 最长的连续相同字符的字符串和最长连续不相同字符的子字符串问题
- KMP求最长连续重复字串——POJ 1961
- [C++]连续最长括号匹配问题
- Leetcode-字符串问题--最长的公共子字符串长度--可不连续--#583
- 求最长连续字串
- 最长重复字串和两字符串中最长公子子串问题
- 字符串匹配问题:输入一个字符串,计算其中包含的‘连续’给定的子字符串最长的个数.
- 重复子串问题(四):求两个字符串的最长公共字串
- 一个看似简单却复杂的问题:求两个字符串的 左向右匹配 所有的 最长连续的 公共子字符串( 在每个字符串中先后次序相同的) 序列
- LCS(最长连续子序列+最长连续字串)
- 求一个字串中最长的连续字符串
- 字符串操作问题:查找给定字符串中,连续重复且长度最长的第一个子串
- 最长公共字串(非连续)
- 求一个字符串的最长重复字串问题
- 【最长连续序列问题】
- 连续正面的最长序列问题
- 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr
- 最长回文字串--------注意一个小点-----添加字符的问题