1. 程式人生 > >求兩個序列的最大公共子序列的長度(遞迴解法)

求兩個序列的最大公共子序列的長度(遞迴解法)

本題主要採用的是遞迴思想(分類討論)
  • 判斷當前兩個字串是否有一個長度為0,若有則直接返回0即可
  • 判斷當前兩個字串中的第一位是否相同,若相同則直接雙方去掉第一位並返回呼叫該方法(引數為兩方截斷首位的字串)再加1(當前相同的第一位,所以返回值加1);若不相同,則返回呼叫本方法引數分別為字串a擷取首位和字串b 與 字串a和字串b擷取首位的最大值返回回去(在此採用了三元表示式)。
package cn.alex.demo;
public class MaxComSeq {
    public static void main(String[] args) {
        String stra = "abcd";
        String strb = "dcbab";
        System.out.println("最大公共子序列長度為:"+maxComSeq(stra, strb));
    }
public static int maxComSeq(String stra,String strb) { if(stra.length()==0 || strb.length()==0) { return 0; } if(stra.charAt(0)==strb.charAt(0)) { return maxComSeq(stra.substring(1), strb.substring(1))+1; }else { return maxComSeq(stra,strb.substring(1)
)>maxComSeq(stra.substring(1),strb)?maxComSeq(stra,strb.substring(1)):maxComSeq(stra.substring(1),strb); } } }

相關推薦

序列公共序列長度解法

本題主要採用的是遞迴思想(分類討論) 判斷當前兩個字串是否有一個長度為0,若有則直接返回0即可 判斷當前兩個字串中的第一位是否相同,若相同則直接雙方去掉第一位並返回呼叫該方法(引數為兩方截斷首位的字

《程式設計師程式碼面試指南》字串公共

/** * 題目: * 給定兩個字串 str1 和 str2,返回兩個字串的最長公共子串。 *舉例: * str1 = "1AB2345CD",str2 = "12345EF",返回"2345"。 */ /** * 解答: * 經典動態規劃的方法可以做到時間複

java實現字串公共字串

/** * @author weichen CHEN created on 2018/4/20 * @version 2018/4/20 weichen CHEN */ public class Test { public static void main

字串公共動態規劃

code如下: //Longest common sequence, dynamic programming method void FindLCS(char *str1, char *str2) { if(str1 == NULL || str2 == NULL)

串的公共序列長度

notes col length body 子字符串 使用遞歸 seq ons commons 1 public class CommonSubsequence { 2 3 public static int f(String s1,String s2){

用javascript字串的相同的

思路: 1.找出兩個字串的最大和最小字串(根據長度)。 2.從最小的字串中先取該字串的長度的子串,判斷大的字串中是否包含該子串,不包含將長度減1,從小的字串中取該長度的子串再去判斷,如此反覆。 &

連續序列和/長不下降序列/公共序列/

//最大連續子序列和 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 10010; int A[maxn],dp[maxn]; int main(){ int

hdu 1159,公共序列 LCS

比較基本的動態規劃 網上的資料都說得比較詳細,覺得其實直接看程式碼會比較直觀易懂 程式碼較短,dp[i][j]表示X的i位和Y的j位之前的最長公共子序列的長度,X和Y是輸入的兩個序列 #include<iostream> #include<string.h> u

動態規劃之longest common subsequence公共序列

這題相對於longest common substring而言更容易一些,區別就子序列和子串, 串的話每個字母是要連續的,序列的話,不要求,用動態規劃做,遞推公式如下,不難: 上程式碼: public class CommonSubseq { public stat

連續序列和”、“遞增序列”、“公共序列”、“公共串”問題總結

一、最大連續子序列和(最大子序列) 最大子序列是要找出由陣列成的一維陣列中和最大的連續子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,達到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。 思路:只要前i項的和還沒有小

長增長子序列公共序列

子序列,不需要連續的。 思路一:傳統的dp,dp[i]表示前i個數且以第i個數字結尾的最長增長子序列,遍歷陣列,dp[i] = max(dp[i], dp[j] + 1)  if nums[i] > nums[j], j from 0 to i 思路二:維護一個

如何字串的公共

此演算法的時間複雜度我還沒想清楚, 程式碼如下: #include<stdio.h>#include<string.h> char * maxsamesubstring(char *s1,char *s2){ int i,j,len,maxlen,i

POJ 1159 Palindrome 公共序列+滾動陣列

題目描述: A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You ar

C語言整數

上程式碼: #include<stdio.h> #define Max(a,b) ((a>b)?(a):(b))  //預處理實現 int max(int a,int b)   //函式實現 {return a>b?a:b; } int main()

LCS字串公共

LCS問題就是求兩個字串最長公共子串的問題。解法就是用一個矩陣來記錄兩個字串中所有位置的兩個字元之間的匹配情況,若是匹配則為1,否則為0。然後求出對角線最長的1序列,其對應的位置就是最長匹配子串的位置。 下面是字串21232523311324和字串31212322344

5千字由淺入深講解動態規劃(JS版)-鋼條切割,公共序列短編輯距離

斐波拉契數列 首先我們來看看斐波拉契數列,這是一個大家都很熟悉的數列: // f = [1, 1, 2, 3, 5, 8] f(1) = 1; f(2) = 1; f(n) = f(n-1) + f(n -2); // n > 2 有了上面的公式,我們很容易寫出計算f(n)的遞迴程式碼: functio

DP簡單問題聯系--長遞增序列+公共序列

text 個數 -- col tle space iostream 子序列 一行 今天重溫了一下dp問題,發現自己兩個禮拜不寫題目就什麽都不會了。。。心態爆炸,感覺去考試怕是要gg了。。。 不過今天總結一下寫的題目,全部都是基礎的dp問題 第一個是 求最長不下降子序列

公共串LCSJava實現

public class Lcs { public static String longest(String s1,String s2){ char ch1[]=s1.toCharArray(); char ch

連續數列和線上處理演算法

問題描述 最大連續子數列和一道很經典的演算法問題,給定一個數列,其中可能有正數也可能有負數,我們的任務是找出其中連續的一個子數列(不允許空序列),使它們的和儘可能大。我們一起用多種方式,逐步優化解決這個問題。 暴力方法 求出所有可能連續子列的和,時間複

[分治] 洛谷P1115 連續段和分治典例

題目 題目描述 給出一段序列,選出其中連續且非空的一段使得這段和最大。 輸入輸出格式 輸入格式: 輸入檔案maxsum1.in的第一行是一個正整數N,表示了序列的長度。 第2行包含N個絕對值不大於10000的整數A[i],描述了這段序列。 輸出格式