給定三個字串 s1, s2, s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。
示例 1:
輸入: s1 = 「aabcc」, s2 = 「dbbca」, s3 = 「aadbbcbcac」
輸出: true
示例 2:
輸入: s1 = 「aabcc」, s2 = 「dbbca」, s3 = 「aadbbbaccc」
輸出: false
就字面意思理解,其實很簡單,這裡想講的是關於它的擴充套件。
我們可以這樣理解,s1和s2中的每個字元都代表乙個動作,每個動作會產生乙個與之匹配的唯一的狀態,那麼原背景就可以理解成,在保證s1和s2中各自動作的相對順序不變的情況下,是否可以達到s3的狀態。這樣以拓展,原本簡單的字串問題,就可以建模成乙個複雜的路徑問題。為什麼要將之稱為路徑問題呢,這是我自己起的,就好像每一步都會到乙個新的座標一樣。
有序的狀態問題,都可以通過動態規劃來解決。
首先,什麼問題是有序的狀態問題。如果我這一步的狀態,是被上一步的動作所影響的,並且每個動作與狀態之間存在函式依賴關係,即乙個動作對應乙個唯一的狀態,並且動作執行的相對順序不能被打破,那這就是有序的狀態問題。
動態規劃最核心的問題是狀態轉移方程。
該背景中,倘若給定了二維動態規劃狀態陣列dp,那麼陣列dp[i][j]表示s3中前i+j個字元(包括第i+j)是否是s1中前i個字元(包括第i)和s2中前j個字元(包括第j)交錯組成的,倘若要判斷 dp[i][j] 為真(s3中前i+j個字元能否有s1中前i個字元以及s2中前j個字元組成),有兩種情形:
1)dp[i-1][j]為真 (s3中前i+j-1個字元能否有s1中前i-1個字元以及s2中前j個字元組成),並且s3中往後移動乙個字元即第i+j個字元和s1中往後移動乙個字元即第i個字元相等
2)dp[i][j-1]為真 (s3中前i+j-1個字元能否有s1中前i個字元以及s2中前j-1個字元組成),並且s3中往後移動乙個字元即第i+j個字元和s2中往後移動乙個字元即第j個字元相等
其餘情形一律為假。
注意不要把這裡的第i個第j個和計算機陣列中下標混淆,理解這句話時,不要去想用**如何實現,單純理解文字,將方案定好,模型建立成功以後,將之翻譯成**,切不可想方案的時候考慮實現,否則很容易相互影響。
#include
#include
using
namespace std;
class
solution
//走到此處,s3一定不為空
l3 = s3.
length()
;//如果數量不相等,直接退出
if(l1 + l2 != l3)
return
false
;/*****
初始化dp陣列dp[i][j]表示s3中前i+j個字元(包括第i+j)是否是s1中前
i個字元(包括第i)和s2中前j個字元(包括第j)交錯組成的
****/
/**這裡橫縱都多宣告一行一列,是因為,如果s1或者s2為空,之後**
實現的初始化**中
由於方案中dp[i][j]表示s3中前i+j個字元,那麼最後乙個字元在陣列中
下標未i+j-1,s1中前i個字元最後乙個在陣列中的下標未i-1,s2為j-1
如果出現了s1或s2為乙個字元的情況,宣告的dp陣列,橫縱座標一定會
有乙個為0,
此時如果要表達s3中前1個字元和s1中前1個、s2中前0個,那就是
dp[1][0],但是實際上編譯器生成的dp空間下標是從0到0,這時候就會
崩潰,所以多宣告了乙個空間,來滿足方案的表達意義
dp[i][j]
|0|0|1|2|
|1|-|-|-|
|2|-|-|-|
|3|-|-|-|
**/vectorbool
>>
dp(l1, vector<
bool
>
(l2,
false))
;//s2為空時
for(
int i =
1; i <= l1;
++i)
//s1為空時
for(
int j =
1; j <= l2;
++j)
for(
int32_t i =
1; i <= l1;
++i)}}
return dp[l1]
[l2];}
};
建議測試時多測試邊緣情況,例如s1、s2、s3各自為空的笛卡爾積結果。 題目四 路徑和
給定乙個包含非負整數的 m x n 網格 grid 請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。說明 每次只能向下或者向右移動一步。輸入 grid 1,3,1 1,5,1 4,2,1 輸出 7 override public int minpathsum int grid int ...
7 5路徑尋找問題
路徑尋找問題可以歸結為隱式圖的遍歷,他的任務是找一條從初始狀態到終止狀態的最優路徑,回溯法是找到一些符合要求的解 八數碼問題 分析 把八數碼問題歸結為圖上最短路問題,用bfs求解 include includeusing namespace std typedef int state 9 const...
ROS學習筆記(6) 路徑規劃
全域性路徑規劃 提供dijkstra和a 演算法,預設使用 dijkstra dijkstra 廣度優先,從近到遠遍歷所有點計算一遍,直至計算出最優路徑 偽 獲取起點座標 目標點座標,把起點放進 openlist while openlist 不為空列表 else else else openlis...