问题:即按两个串的顺序,找出相同的子序列(可跳跃查找)
解法一:递归求解
将s1的每个字母打头,
依次在s2中寻找相同的字符
找到相同的:该字符+dfs(s1中该字符之后的串,s2中该字符之后的串) //即接着对剩余的串递归
代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
/*
* 思路:
* */
public static void main(String[] args) {
//(1)输入相关数据
Scanner sc = new Scanner(System.in);
String s1 = sc.next();//串1
String s2 = sc.next();//串2
//(2)寻找最大公共子序列
System.out.println(dfs(s1,s2));
}
private static ArrayList<Character> dfs(String s1, String s2) {
ArrayList<Character> maxans=new ArrayList<Character>();//记录结果(需放在该函数内,如果作为全局变量,结果不对)
for(int i=0;i<s1.length();i++) {
//以i开头的公共子序列
ArrayList<Character> ans=new ArrayList<Character>();
for(int j=0;j<s2.length();j++) {
if(s1.charAt(i)==s2.charAt(j)) {//相等
ans.add(s1.charAt(i));
ans.addAll(dfs(s1.substring(i+1),s2.substring(j+1)));
break;
}
}
if(ans.size()>maxans.size()) //比较以i开头的公共子序列 与 当前最大公共子序列的长度
maxans = ans;
}
return maxans;
}
}