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.
思路:s3中如果包含s1和s2,并且s1,s2中字母的相对顺序保持不变。则true;
先用一个二维数组记录下s1,s2的相对位置,将其结果跟s3进行一一比较到s3的最后。这样就可以得出最终结果。具体细节:guess
s1的部分跟s3匹配了,s2匹配结束,则f(i,j)=s1(i-1,j)+s1(i)==s3(i+j-1)
public class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
if(s3.length() != s1.length()+s2.length())
return false;
//initial array
boolean[][] f=new boolean[s1.length()+1][s2.length()+1];
for(int i=0; i<=s1.length();i++)
for(int j=0; j<=s2.length();j++)
f[i][j] = true;
<pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 16px; line-height: 30px;"> //record s1,s2 position
for(int i=1; i<=s1.length();i++) f[i][0]= f[i-1][0] && s1.charAt(i-1)==s3.charAt(i-1); for(int j=1; j<=s2.length();j++) f[0][j]= f[0][j-1] && s2.charAt(j-1)==s3.charAt(j-1); //match s3 with s1,s2 one word by one word for(int i=1; i<=s1.length();i++) for(int j=1; j<=s2.length();j++) f[i][j] = (f[i-1][j]&&(s1.charAt(i-1) == s3.charAt(i+j-1))) || (f[i][j-1]&&(s2.charAt(j-1)==s3.charAt(i+j-1))); return f[s1.length()][s2.length()]; }}