1. 程式人生 > >最長公共子序列python實現

最長公共子序列python實現

        最長公共子序列是動態規劃基本題目,下面按照動態規劃基本步驟解出來。

1.找出最優解的性質,並刻劃其結構特徵

序列a共有m個元素,序列b共有n個元素,如果a[m-1]==b[n-1],那麼a[:m]和b[:n]的最長公共子序列長度就是a[:m-1]和b[:n-1]的最長公共子序列長度+1;如果a[m-1]!=b[n-1],那麼a[:m]和b[:n]的最長公共子序列長度就是MAX(a[:m-1]和b[:n]的最長公共子序列長度,a[:m]和b[:n-1]的最長公共子序列長度)。

2.遞迴定義最優值


3.以自底向上大方式計算出最優值

python程式碼如下:
def lcs(a,b):
	lena=len(a)
	lenb=len(b)
	c=[[0 for i in range(lenb+1)] for j in range(lena+1)]
	flag=[[0 for i in range(lenb+1)] for j in range(lena+1)]
	for i in range(lena):
		for j in range(lenb):
			if a[i]==b[j]:
				c[i+1][j+1]=c[i][j]+1
				flag[i+1][j+1]='ok'
			elif c[i+1][j]>c[i][j+1]:
				c[i+1][j+1]=c[i+1][j]
				flag[i+1][j+1]='left'
			else:
				c[i+1][j+1]=c[i][j+1]
				flag[i+1][j+1]='up'
	return c,flag

def printLcs(flag,a,i,j):
	if i==0 or j==0:
		return
	if flag[i][j]=='ok':
		printLcs(flag,a,i-1,j-1)
		print(a[i-1],end='')
	elif flag[i][j]=='left':
		printLcs(flag,a,i,j-1)
	else:
		printLcs(flag,a,i-1,j)
		
a='ABCBDAB'
b='BDCABA'
c,flag=lcs(a,b)
for i in c:
	print(i)
print('')
for j in flag:
	print(j)
print('')
printLcs(flag,a,len(a),len(b))
print('')

執行結果輸出如下:

4.根據計算最優值得到的資訊,構造最優解

上圖是執行結果,第一個矩陣是計算公共子序列長度的,可以看到最長是4;第二個矩陣是構造這個最優解用的;最後輸出一個最優解BCBA。

相關推薦

公共序列python實現

        最長公共子序列是動態規劃基本題目,下面按照動態規劃基本步驟解出來。 1.找出最優解的性質,並刻劃其結構特徵 序列a共有m個元素,序列b共有n個元素,如果a[m-1]==b[n-1],那麼a[:m]和b[:n]的最長公共子序列長度就是a[:m-1]和b[:n-

遞增列、公共序列 python實現

DP演算法: 最長公共子序列: 把問題分成兩種情況來討論: 1. 如果S1[i] == S2[j]。就是i,j對應位置上的字元相等。那麼可以得出M[i,j] = M[i-1,j-1]+1;為什麼呢?可以想象的。如果M[i-1,j-1]也是一個最後方案,在這個最優方案上我們同

公共序列 python

注意:子序列和子串的區別,前者是字串裡的不相隔的字元組成的串,字元的先後順序不變;後者是連續的字元組成的字串 實現下面的遞推式,就實現了dp動歸。更多圖解的過程,可以參看部落格http://blog.csdn.net/hrn1216/article/details/51534607

公共序列-java實現

之前看過一個LCS演算法的實現過程,覺得太過繁瑣。自己寫了一個比較簡單的,此處僅僅介紹實現過程。 程式程式碼測試通過,需要的童鞋可以在這裡拷貝一下,程式碼如下: package com.wsy.dy

python實現公共序列的求解

(待完善...) 最長公共子序列是動態規劃基本題目,下面按照動態規劃基本步驟解出來。 1.找出最優解的性質,並刻劃其結構特徵 序列a共有m個元素,序列b共有n個元素,如果a[m-1]==b[n-1],那麼a[:m]和b[:n]的最長公共子序列長度就是a[:m-1]和b[:n-1]的最長公

python實現Longest Common Subsequence公共序列演算法

    最長公共子序列是很基本的演算法,只是最近用到了就又拿來學習一下,網上有很多很多的Java版本的,的確寫的也很不錯,思想都很好,大致上分為三種: 1.基於遞迴的思想 2.基於動態規劃的思想 3.基於HashMap的動態規劃     在這裡我使用的是python來實現,

python實現公共序列演算法(找到所有公共串)

軟體安全的一個小實驗,正好複習一下LCS的寫法。 實現LCS的演算法和演算法導論上的方式基本一致,都是先建好兩個表,一個儲存在(i,j)處當前最長公共子序列長度,另一個儲存在(i,j)處的回溯方向。 相對於演算法導論的版本,增加了一個多分支回溯,即儲存回溯方向時出現了向上向左都可以的情況時,這時候就代表可能

Python實現求兩個字串的公共序列的演算法

        前幾天用C++實現了求兩個字串的最長公共子序列的演算法,並對演算法進行了優化,現在將該演算法用Python重新實現,基本思路C++版本是一致的。參見:求兩字串的最長公共子序列——動態規劃         1.其中需要注意幾個細節:         (1)P

公共串和公共序列Python實現

動態規劃(dynamic programming)是運籌學的一個分支,是求解決策過程(decision process)最優化的數學方法。簡單的理解為:是將一個棘手的問題,分成一個個小問題,先著手解決

51nod 1006 公共序列Lcs(dp+string,無標記數組實現)

轉移 opened mes star 字符 tex src 表示 logs 1006 最長公共子序列Lcs 基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題 收藏 關註 取消關註 給出兩個字符串A B,求A與B的最長公共子序

公共序列(Java實現)——動態規劃

【問題描述】 給定2個序列X和Y,當另一序列Z既是X的子序列又是Y的子序列時,稱Z是序列X和Y的公共子序列。 給定2個序列X={A,B,C,B,D}和Y={B,D,C,A,B},找出X和Y的最長公共子序列{B,C,B}。 【分析】最長公共子序列問題具有最優子結構性質 設 X = {

動態規劃實現公共序列

1 public class Test2 { 2 3 static int[][] result; 4 static String str1 = "ABCBDAB"; 5 static String str2 = "BDCABA"; 6 static cha

用動態規劃實現公共序列C語言

思路: 有兩個字元陣列a,b 分為三種情況: 比較a,b陣列當前長度的最後一個字元 相等時, lsc值等於前一段值加1 即:當a[i-1]==b[j-1]時(因為i,j是從1開始,所以是a[i-1],b[j-1]),lsc[i][j]=lsc[i-1][j-1

公共串與公共序列(動歸實現

什麼是子序列?一個給定的序列的子序列,就是將給定序列中零個或多個元素去掉之後得到的結果。 什麼是子串?給定串中任意個連續的字元組成的子序列稱為該串的子串。(相對於子序列,子串是連續的) 如abcde

動態規劃求解公共序列的C++演算法實現

#include<iostream> using namespace std; int CommonOrder(char x[] ,int m ,char y[], int n, char z[]) {     int i,j,k;     int L[10][1

演算法課堂實驗報告(四)——python動態規劃(公共序列LCS問題)

python實現動態規劃 一、開發環境 開發工具:jupyter notebook 並使用vscode,cmd命令列工具協助程式設計測試演算法,並使用codeblocks輔助編寫C++程式 程式語言:python3.6 二、實驗內容 1.最長公共子序列問題。分別求x=

Python 動態規劃演算法求解公共序列

前言:在網上看到一道360的秋招真題,題目如下: 仔細讀題後發現這是一道求解最長公共子序列的問題,最好使用動態規劃演算法。 題目大意: 小B坐火車,從起點到終點的車站序列已知,期間他睡了兩覺,到終點的時候還在睡,也就是說中間他醒了兩次,這兩次清醒的時間,有兩個車站子序列,

Java實現演算法導論中公共序列(LCS)動態規劃法

1、問題: 求兩字元序列的最長公共字元子序列LCS 2、求解:動態規劃法                      動態規劃的思路就是用一個矩陣來記錄兩個字串中所有位置的兩個字元之間的匹配情況,若是匹配則為1,否則為0。然後求出對角線最長的1序列,其對應的位置就是最長匹配子

給出兩個字串,找到公共序列(LCS),返回LCS的長度。C實現

給出兩個字串,找到最長公共子序列(LCS),返回LCS的長度。 您在真實的面試中是否遇到過這個題? Yes Basic Information Tags Related Problems My No

C++實現公共序列公共

// LCS.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <string> #include <vector> #include <iostream> using