蓝桥杯の最大公共子串

求两个串的所有子串中能够匹配上的最大长度是多少。

比如:"abcdkkk" 和 "baabcdadabc",

可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。

下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。

public class Main {
	static int f(String s1, String s2) {
		char[] c1 = s1.toCharArray();
		char[] c2 = s2.toCharArray();

		int[][] a = new int[c1.length + 1][c2.length + 1];

		int max = 0;
		for (int i = 1; i < a.length; i++) {
			for (int j = 1; j < a[i].length; j++) {
				if (c1[i - 1] == c2[j - 1]) {
					a[i][j] = ?;// 填空
					if (a[i][j] > max)
						max = a[i][j];
				}
			}
		}

		return max;
	}

	public static void main(String[] args) {
		int n = f("abcdekkk", "baabcdeadabc");
		System.out.println(n);
	}
}

请分析该解法的思路,并补全问号部分缺失的代码。

---------------------------------------------

答案:a[i-1][j-1]+1


思路(从别人博客看到的):

(1)这个有点dp的意思,

   分别计算两个字符串每一个字符到另一个字符是否相等, 

   若相等,则加前面字符的最大字符串; 

   若前面字符也分别相等则他就等于a[i-1][j-1]+1;

   若不相等则为0+1

(2)动态规划的思想,

   a[i][j]表示到字符串s1的i位置和s2的j位置的最大公共子串的长度 ,

   数组初始化为0。

   为了方便理解,我们这么想,

   如果s1的字符串的第一个字符和s2的第一个字符相同,那么a[1][1] = 1;

   如果两个字符串的第二个字符和相同,

   那么,到第二个位置的最长公共子串就等于1+1 = 2,

   也就是到第一个字符的公共子串的个数+1。

   即a[i][j] = 1+ a[i-1][j-1]。

   因此,我们可以从第一个位置开始递推求出到任意一个位置的公共子串,

   在递推过程中记录最大的结果即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值