最长公共子序列之求出所有子序列java源代码(回溯+动态规划)

本文介绍了如何使用Java编程实现Longest Common Subsequence (LCS)算法,通过动态规划求解字符串间的最长公共子序列。重点展示了代码实现和回溯过程,并通过实例展示了如何在两个给定字符串'ABCBDAB'和'BDCABA'中找到最长公共子序列的长度及具体子串。
摘要由CSDN通过智能技术生成
package suanfa;

import java.util.ArrayList;
import java.util.List;

public class LongestCommonSubsequence {
	static int[][] dp;
	static 	List<String> x = new ArrayList<String>();
	public static void main(String[] args) {
		int k=longestCommonSubsequence("ABCBDAB", "BDCABA");
		 traceBack(7, 6, "", "ABCBDAB", "BDCABA", dp);
		System.out.println(k);
		for(String s : x) {
			System.out.println(s);
		}
	}
	public static int longestCommonSubsequence(String text1, String text2) {
	      dp=new int[text1.length()+1][text2.length()+1];
          
	      for(int i=1;i<dp.length;i++){

	          for(int j=1;j<dp[0].length;j++){
	              if(text1.charAt(i-1)==text2.charAt(j-1)){
	                  dp[i][j]=dp[i-1][j-1]+1;
	                  
	                  
	              }else{
	                  dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
	              }
	          }
	      }
	     
	      return dp[text1.length()][text2.length()];
	    }
	private static void traceBack(int i, int j, String lcs_str,String t1,String t2,int[][] dp) {
		while (i>0 && j>0) {
			if (t1.charAt(i-1) == t2.charAt(j-1)) {
				lcs_str += t1.charAt(i-1);
				--i;
				--j;
			}
			else {
				if (dp[i-1][j]> dp[i][j-1])
					--i;
				else if (dp[i-1][j] < dp[i][j-1])
					--j;
				else {  // 相等的情况
					traceBack(i-1, j, lcs_str,t1,t2,dp);
					traceBack(i, j-1, lcs_str,t1,t2,dp);
					return;
				}
			}
		}
		x.add(lcs_str);
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值