求兩個序列的最大公共子序列的長度(遞迴解法)
本題主要採用的是遞迴思想(分類討論)
- 判斷當前兩個字串是否有一個長度為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問題 第一個是 求最長不下降子序列
最大公共子串LCS(Java實現)
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],描述了這段序列。 輸出格式