97. Interleaving String - Medium
前往題目
思路
這題畫二維陣列會清楚許多
- 檢查
s1
和s2
的長度加起來是否和s3
一樣長,因為s1
和s2
是組成s3
的所有部分 dp
二維陣列,一維與二維,指的是s1
和s2
的指針,true
代表當前取的s1
和s2
可以成功組成s3的一部分,false
則不行dp
的確定條件是dp[s1的長度][s2的長度]
為true
,因為那個位置代表s1
和s2
都看過一遍,可以成功組成s3
- 從後往前疊代,由
dp
的確定條件慢慢往上推論
關鍵就是一個字母一個字母來看,而不用分辨是s1
的片段還是是s2
的
Code
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
// s3 should be made of s1 and s2
if (s1.length() + s2.length() != s3.length()) return false;
// Extra column and row for algo.
boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1];
// The end will be always be true if both pointer can reach
dp[s1.length()][s2.length()] = true;
// bottom-up
for (int i = s1.length(); i >= 0; --i) {
for (int j = s2.length(); j >= 0; --j) {
// 確保i和j在s1,s2範圍內
// dp[i+1][j]代表當前我們已經用過了,要用下一個,如果是true那當前變為true才有意義,代表目前都是valid的
if (i < s1.length() &&
s1.charAt(i) == s3.charAt(i + j) &&
dp[i + 1][j]) {
dp[i][j] = true;
}
if (j < s2.length() &&
s2.charAt(j) == s3.charAt(i + j) &&
dp[i][j + 1]) {
dp[i][j] = true;
}
}
}
return dp[0][0];
}
}
97. Interleaving String - Medium
https://f88083.github.io/2024/03/06/97-Interleaving-String-Medium/