求最长公共子串序列问题:
首先理解什么是公共子串
这里公共子串不一定是连续的,字母相同也算,中间可以有间隔。
重点是一个判断点:串a和串b
if(a[i]==b[j]){
相当于在矩阵中,当前值为左上方值加一
结果集map[i][j] = map[i-1][j-1] + 1;
}
else{
当前位置的上方和左边两个值的最大值
map[i][j] = MATH.max(map[i][j-1],map[i-1][j])
}
后一步由前面的几步得来
ac代码
package com.work06;
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
//两个字符串数组
String x = sc.next();
String y = sc.next();
char[] a = x.toCharArray();
char[] b = y.toCharArray();
int la = x.length();
int lb = y.length();
int map[][] = new int[la+1][lb+1];
for(int i=1;i<=la;i++)
{
for(int j=1;j<=lb;j++)
{
if(a[i-1]==b[j-1])
//如果当前元素相同,则结果在前一步的结果加一
{
map[i][j]=map[i-1][j-1]+1;
}
else
//如果当前元素不相同
{
map[i][j]=Math.max(map[i-1][j],map[i][j-1]);
}
}
}
System.out.println(map[la][lb]);
}
}
}