SCUT J.O: 最大公共子串

本文介绍了一种求解多个字符串间最长公共子串的方法,采用动态规划算法进行两两对比,通过穷举策略找到最短的最大公共子串长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最大公共子串


Time Limit:

1000MS

 
Memory Limit:

10000K

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个非空串的最长公共子串的长度。

Sample Input

1

3

ab

bc

cd

Sample Output

0

Hint

No hint.

Source

 

思路:

 其实这道题应为“最大公共子序列”,一般定义子串是连续的,子序列则允许不连续,于是子序列的算法比子串麻烦得多。

 》由于数据量不是很大,我还是采取了穷举的思路,至多100个字符串,令他们两两比对(至多5050对),记下两两的最大公共子串长度,而这些长度中最小的那个就是答案。

》关于公共子串的算法,用到DP,注意数组最好先加上两条都是0的边,实现起来更方便。

假设s1和s2比对,长度分别为l1,l2,先初始化数组,两条边a[0][x]和a[x][0](x = 0, 1, 2,……)全为0,其他位置全为-1;

对1~l1*1~l2的范围DP,a[i][j]表示s1从1到i的前缀与s2从1到j的前缀的最长公共子序列的长度;

递归:a[i][j] = max{ a[i - 1][j - 1] + same(s1[i], s2[j]),a[i - 1][j],a[i][j - 1] };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值