最長公共子串行LCS和最長回文子串行的動態規劃演算法

2021-07-25 06:39:40 字數 1027 閱讀 2939

c[i][j] 用來表示 x[i] 和y[j] 的lcs 長度

對c[i][j],

若i = 0或j = 0,則c[i][j] = 0, 兩個原序列有乙個為空,則沒有lcs;

若i,j > 0 且x[i] = y[j],則c[i][j] = c[i-1][j-1] + 1;

若i,j > 0 且x[i] != y[j],則c[i][j] = max(c[i,j-1], c[i-1,j])

<?php

$x = array('a','b','c','b','d','a','b');

$y = array('b','d','c','a','b','a');

$c = lcslength($x, $y);

//var_dump($c);

printlcs($c, $x, $y, count($x), count($y));

function lcslength($x, $y)

for ($j = 0; $j <= $n; $j++)

$i = 1;

while ($i <= $m) else if ($c[$i - 1][$j] >= $c[$i][$j - 1])else

$j++;

}$i++;

}return $c;

}function printlcs($c, $x, $y, $i, $j)elseif ($c[$i - 1][$j] >= $c[$i][$j - 1])else

}

拓展:最長回文子串行的動態規劃演算法

實際上求最長回文子串行即是求字串與其倒序的lcs,狀態轉移方程式為:

對給定x[0...n-1] 有dp[i][j]表示其最長回文子串行的值,i指向字串頭,j指向尾

若i=j,則dp[i][j] = 1;

若x[i] = x[j],dp[i][j] = dp[i+1][j-1] + 2;

若x[i] != x[j],dp[i][j] = max(dp[i-1][j], dp[i][j-1]);

回文串 LCS(最長公共子串行)

乙個字串如果從左往右讀和從右往左讀都一樣,那麼這個字串是乙個回文串。例如 abcba abccba 蒜頭君想通過新增字元把乙個非回文字串變成回文串。例如 trit 可以新增乙個 i 變成回文串 tirit 請你用程式計算出,對於乙個給定的字串,最少需要新增幾個字元,才能變成回文串。輸入乙個長度為 n...

LCS(最長公共子串行)求回文串最長

給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字元個數。輸入描述 輸入資料有多組,每組包含乙個字串s,且保證 1 s.length 1000.輸出描述 對於每組資料,輸出乙個整數,代表最少需要刪除的字元個數。輸入 abcda googl...

LCS 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上 公升的序列 i1,i2,ik 使得對 j 1,2,k,有 xij zj。比如z a,b,f,c 是 x a,b,c,f,b,c 的子串行。現在給出兩個序列 x和 y,你的任務是找到 x和 y的最大公共子...