判斷s1、s2能否混合組成s3,可以先判斷s3的子串能否由前兩者的子串組合而成,最基本的形式是,s3的第乙個字元是否等於s1或s2的第乙個字元。
一、題目簡述
題目大意是給定三個字串,判斷第三個字串能否由前兩個混合成,但是前兩個字串要保持各自的字元順序。
如下的三個字串,c是能由a、b組合成的
string a: cat
string b: tree
string c: tcraete
而下方的三個字串則不滿足要求
string a: cat
string b: tree
string c: catrtee
樣例輸入二、問題分析3cat tree tcraete
cat tree catrtee
cat tree cttaree
樣例輸出
data set 1: yes
data set 2: yes
data set 3: no
string 3能由前兩個字串中的字元混合而成,顯然,它的子字串也必然能由前兩個字串混合成。反之,如果string 3的子串不能由string 1和string 2混合而成,那麼該問題的答案就是 no。基於此,我們首先從string 3的第乙個字元開始判斷,依次到前兩個,前三個……如果直到最後的全部字元都滿足條件則答案是yes。
定義string 3的前 i+j 個字元,能否由string 1的前 i 個字元和string 2 的前 j 個字元組成的問題,為yes[i][j]。(注意,這裡的 i、j 不是下標,本題的下標都從0開始。)共有兩種情況:
(1)string 1 的第 i 個字元是string 3 的第 i+j 個字元,也即string 1[i-1]=string 3[i+j-1],此時子問題為string 3 的前 i+j-1個字元能否由string 1的前 i-1 個字元和string 2的前 j 個字元組成,即yes[i-1][j];
(2)string 2 的第 j 個字元是string 3 的第 i+j 個字元,也即string 2[j-1]=string 3[i+j-1],此時子問題為string 3 的前 i+j-1個字元能否由string 1的前 i 個字元和string 2的前 j-1 個字元組成,即yes[i][j-1]。
三、源**
// zipper.cpp :
//#include
using
namespace std;
intmain()
}if(yes[len1]
[len2]
) cout <<
"data set "
<< num <<
": "
<<
"yes"
<< endl;
else
cout <<
"data set "
<< num <<
": "
<<
"no"
<< endl;
}return0;
}
POJ2192 Zipper(動態規劃)
這個題目要求判斷2個字串能否組成1個字串,例如cat和tree能組成tcraete。我們定義乙個布林型別的二維陣列array,array i j 表示str1 i 和str2 j 能否組成str i j i 0或者j 0表示空字串,所以初始化時,array 0 j 表示str1的前j個字元是否和st...
077day(動態規劃題(Zipper)的嘗試)
172210704111 陳國佳總結 2017年12月27日 連續077天 內容 這道題按照我的理解,為給兩個字串,按它們字母的順序,看能否組成第三個字串 其中,1這道題我暫時還未解出來,先給一下錯誤 const int num 200 int n,al,bl cin n char a num b ...
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...