動態規劃 字串交叉問題

2021-08-27 16:03:55 字數 1586 閱讀 8928

給出三個佇列 s1,s2,s3 ,判斷 s3 是否是由 s1 和 s2 交叉得來。 如:s1 為 aabcc , s2 為 dbbca。 當 s3 為 aadbbcbcac 時,返回 true(即將 s1 拆成三部分: aa,bc,c 分別插入 s2 對應位置) 否則返回 false。

aabcc,dbbca,aadbbcbcac

true

aabcc,dbbca,aadbbcbcac

aabcc,dbbca,aadbbbaccc

a,b,ab

a,b,ba

a,b,ac

abc,bca,bcaabc

abc,bca,aabbcc

true

false

true

true

false

true

false

本題使用動態規劃演算法,**dp[i][j]**表示使用s1的前i個字元和s2的前j個字元組成s3的前i+j個字元的可能性。很顯然,dp[0][0] = true;,動態陣列初始化為:

for

(int i =

1; i <= s1.

length()

; i++

) dp[i][0

]= dp[i -1]

[0]&&

(s1[i -1]

== s3[i -1]

);for(

int i =

1; i <= s2.

length()

; i++

) dp[0]

[i]= dp[0]

[i -1]

&&(s2[i -1]

== s3[i -1]

);

遞迴公式為:

int k = i + j;

if(s1[i -1]

== s3[k -1]

) dp[i]

[j]= dp[i]

[j]|| dp[i -1]

[j];

if(s2[j -1]

== s3[k -1]

) dp[i]

[j]= dp[i]

[j]|| dp[i]

[j -1]

;

#include

#include

#include

#include

#include

using

namespace std;

bool

isvalid

(string s1, string s2, string s3)

}return dp[s1.

length()

][s2.

length()

];}int

main()

return0;

}

交叉字串

給出三個字串 s1 s2 s3,判斷s3是否由s1和s2交叉構成。樣例 比如 s1 aabcc s2 dbbca 當 s3 aadbbcbcac 返回 true.當 s3 aadbbbaccc 返回 false.dp i j k 代表 當到了s3的第i位時,s1的到了第j位 s2到了第k位。因為i是...

動態規劃 最長上公升字串問題

首先定義上公升字串,對於任意的0這道題首先想到利用動態規劃的思路,動態規劃的基本思想就是 問題的最優解如果可以由子問題的最優解推導得到,則可以先求解子問題的最優解,在構造原問題的最優解 若子問題有較多的重複出現,則可以自底向上從最終子問題向原問題逐步求解。因此這道題可以理解成兩個問題 在已知前n 1...

字串的擴充套件距離問題(動態規劃)

對於長度相同的2個字串a和b,其距離定義為相應位置字元距離之和。2個非空格字元的距離是它們的ascii碼之差的絕對值 空格與空格的距離為0,空格與其他字元的距離為乙個定值k。在一般情況下,字串a和b的長度不一定相同。字串a的擴充套件是在a中插入若干空格字元所產生的字串。在字串a和b的所有長度相同的擴...