最大公共子串
2017-04-13 18:33
183 查看
最大公共子串
Time Limit: 1000MS Memory Limit: 32768KB
Submit Statistic
Problem Description
从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩下地字符按原来顺序组成的串。例如:“ ”,“a”,“xb”,“aaa”,“bbb”,“xabb”,“xaaabbb”都是串“xaaabbb”的子串。(例子中的串不包含引号。)
编程求N个非空串的最长公共子串的长度。限制:2<=N<=100;N个串中的字符只会是数字0,1,…,9或小写英文字母a,b,…,z;每个串非空且最多含100个字符;N个串的长度的乘积不会超过30000。
Input
文件第1行是一个整数T,表示测试数据的个数(1<=T<=10)。接下来有T组测试数据。各组测试数据的第1行是一个整数Ni,表示第i组数据中串的个数。各组测试数据的第2到N+1行中,每行一个串,串中不会有空格,但行首和行末可能有空格,这些空格当然不算作串的一部分。
Output
输出T行,每行一个数,第i行的数表示第i组测试数据中Ni个非空串的最长公共子串的长度。
Example Input
1
3
ab
bc
cd
Example Output
0
Hint
Author
Time Limit: 1000MS Memory Limit: 32768KB
Submit Statistic
Problem Description
从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩下地字符按原来顺序组成的串。例如:“ ”,“a”,“xb”,“aaa”,“bbb”,“xabb”,“xaaabbb”都是串“xaaabbb”的子串。(例子中的串不包含引号。)
编程求N个非空串的最长公共子串的长度。限制:2<=N<=100;N个串中的字符只会是数字0,1,…,9或小写英文字母a,b,…,z;每个串非空且最多含100个字符;N个串的长度的乘积不会超过30000。
Input
文件第1行是一个整数T,表示测试数据的个数(1<=T<=10)。接下来有T组测试数据。各组测试数据的第1行是一个整数Ni,表示第i组数据中串的个数。各组测试数据的第2到N+1行中,每行一个串,串中不会有空格,但行首和行末可能有空格,这些空格当然不算作串的一部分。
Output
输出T行,每行一个数,第i行的数表示第i组测试数据中Ni个非空串的最长公共子串的长度。
Example Input
1
3
ab
bc
cd
Example Output
0
Hint
Author
#include <cstring> #include <string> #include <iostream> using namespace std; #define max2(a,b) ((a) > (b) ? (a) : (b))//返回最大值 #define min2(a,b) ((a) < (b) ? (a) : (b))//返回最小值 char s[105][105]; int len[105]; int dp[30005]; int n; int f(int *x) { int index, i, j, r; for(i=1;i<=n;i++) if(x[i]==0) return 0; for(index=x -1,i=n-1;i>=1;i--) index=index*len[i]+x[i]-1; if(dp[index]>=0) return dp[index]; for(i=2;i<=n;i++) if(s[1][x[1]-1]!=s[i][x[i]-1]) break; if(i>n) { for(j=1;j<=n;j++) x[j]--; r=f(x)+1; for(j=1;j<=n;j++) x[j]++; } else { r=0; for(j=1;j<=n;j++) { x[j]--; int t=f(x); r=max2(t,r); x[j]++; } } dp[index]=r; return r; } int main() { int t; int temp[105]; cin>>t; while(t--) { cin>>n; for(int i=1;i<=n;i++) { cin>>s[i]; len[i]=temp[i]=strlen(s[i]); } memset(dp,-1,sizeof(dp)); cout<<f(temp)<<endl; } return 0; }
相关文章推荐
- 【转载】最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- [字符串]寻找一个字符串中最大的公共子串
- 最大公共子串--动态规划
- java实现字符串匹配求两个字符串的最大公共子串
- 最大公共子串长度问题
- 转:最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 蓝桥杯java第八届B组:最大公共子串
- LCS算法寻找字符串最大公共子串
- (C#)最大公共子串
- 动态规划:给出两个字符串s1和s2,返回其中最大的公共子串
- 美团2017编程题—拼凑钱币&大富翁游戏&最大矩形面积&最长公共连续子串
- 最大公共子串问题的Python解法
- C++实现求两个字符串的最大公共子串
- 查找两个串的最大公共子串
- 求两个字符串的最大公共子串
- js算法:动态规划-最大公共子串与最大子段和
- 最大子序列、最长连续公共子串(连续)、最长公共子序列(动态规划)
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- poj3080解题报告(暴力、最大公共子串)
- C/C++ | 30-27 给定字符串A和B,输出A和B中的最大公共子串