標籤:
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = "aabcc",
s2 = "dbbca",
When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.
又是一個關於字串的動態規劃題,Distinct Subsequences、Edit Distance都差不多,肯定回溯法是可以解出來的,但是肯定時間複雜度比較高。這時候想起來動態規划算法。分析基本跟上述兩個問題的方式是一樣的。
還是看住最後一個字元s1[j], s2[i]與s3[i+j-1]之間的關係,代碼見下:
public boolean isInterleave(String s1, String s2, String s3) { if (s1.length() + s2.length() != s3.length()) return false; boolean[][] dp = new boolean[s2.length()+1][s1.length()+1]; dp[0][0] = true; for (int i = 1; i < dp[0].length; i++) { dp[0][i] = s1.charAt(i-1) == s3.charAt(i-1) && dp[0][i-1]; } for (int i = 1; i < dp.length; i++) { dp[i][0] = s2.charAt(i-1) == s3.charAt(i-1) && dp[i-1][0]; } for (int i = 1; i < dp.length; i++) { for (int j = 1; j < dp[i].length; j++) { dp[i][j] = (s3.charAt(i+j-1) == s1.charAt(j-1) && dp[i][j-1]) || (s3.charAt(i+j-1) == s2.charAt(i-1) && dp[i-1][j]); } } return dp[s2.length()][s1.length()]; }
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
LeetCode-Interleaving String