• JAVA最长公共子序列


    题目描述

    使用动态规划算法求两个序列的最长公共子序列,需构造一条最长公共子序列。

    输入

    每组输入包括两行,每行包括一个字符串。

    输出

    两个字符序列的一条最长公共子序列。(输入已确保最长公共子序列的唯一性)

    样例输入 Copy

    acdbxx
    ccdxx

    样例输出 Copy

    cdxx

    package lianxi5;
    
    import java.util.Scanner;
    /*
     * 最长公共子序列
     */
    public class Main18 {
    	public static void main(String[] args) {
    		Scanner sc=new Scanner(System.in);
    		String str1=sc.nextLine();
    		String str2=sc.nextLine();
    		char st1[]=new char[str1.length()];
    		char st2[]=new char[str2.length()];
    		
    		for(int i=0;i<str1.length();i++) {
    			st1[i]=str1.charAt(i);
    		}
    		for(int i=0;i<str2.length();i++) {
    			st2[i]=str2.charAt(i);
    		}
    		maxCommonChar(st1,st2);
    	
    	}
     
    
    public static void maxCommonChar(char [] a, char [] b){  
            int m = a.length;  
            int n = b.length;  
            int [][] len = new int[m + 1][n + 1];
            int [][] flags = new int[m + 1][n + 1];
            for(int i = 0; i <= m - 1; i++){
                for(int j = 0; j <= n - 1; j++){  
                    if(a[i] == b[j]){
                        len[i + 1][j + 1] = len[i][j] + 1;  
                        flags[i + 1][j + 1] = 1; 
                    }else if(len[i + 1][j] >= len[i][j + 1]){  
                        len[i + 1][j + 1] = len[i + 1][j];  
                        flags[i + 1][j + 1] = 2;  
                    }else{  
                        len[i + 1][j + 1] = len[i][j + 1];  
                        flags[i + 1][j + 1] = 3;  
                    }  
                }  
            }  
            int k = len[m][n];
            char [] commonChars = new char[k];
            int i = m, j = n; 
            for(;i > 0 && j > 0;){  
                if(flags[i][j]==1){
                    commonChars[k - 1] = a[i - 1];  
                    k--;  
                    i--;  
                    j--;  
                }else if(flags[i][j] == 2){  
                    j--; 
                }else{  
                    i--;  
                }  
            }   
         
            for(int l = 0; l <= len[m][n] - 1; l++){  
                System.out.print(commonChars[l]);  
            }  
    }  
    }
  • 相关阅读:
    [NOIP2008] 提高组 洛谷P1125 笨小猴
    洛谷P3384 【模板】树链剖分
    Bzoj1503 [NOI2004]郁闷的出纳员
    POJ1422 Air Raid
    洛谷P1133 教主的花园
    洛谷P1186 玛丽卡
    HDU5115 Dire Wolf
    POJ1308 Is It A Tree?
    POJ2513 Colored Sticks
    Bzoj2326 [HNOI2011]数学作业
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309573.html
Copyright © 2020-2023  润新知