8.13 动态规划例题--最长公共子序列

本文介绍了两种方法解决寻找两个字符串的最大公共子序列问题。解法一采用递归,通过以每个字符为起点,寻找匹配并递归求解;解法二使用动态规划,虽然更复杂,但效率更高。这两种方法都是信息技术领域中常见的算法问题解决策略。

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

问题:即按两个串的顺序,找出相同的子序列(可跳跃查找)

解法一:递归求解

将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;
	}
	
}

解法二:动态规划(复杂)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值