給出三個佇列 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,aadbbcbcacaabcc,dbbca,aadbbbaccc
a,b,ab
a,b,ba
a,b,ac
abc,bca,bcaabc
abc,bca,aabbcc
true本題使用動態規劃演算法,**dp[i][j]**表示使用s1的前i個字元和s2的前j個字元組成s3的前i+j個字元的可能性。很顯然,dp[0][0] = true;,動態陣列初始化為:false
true
true
false
true
false
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的所有長度相同的擴...