Interleaving String

Given s1s2s3, 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.

 1 public class Solution {
 2     public boolean isInterleave(String s1, String s2, String s3) {
 3         int length_s1 = s1.length();
 4         int length_s2 = s2.length();
 5         int length_s3 = s3.length();
 6         if(length_s1 + length_s2 != length_s3)
 7             return false;
 8         boolean state[][] = new boolean[length_s1 + 1][length_s2 + 1];
 9         //init state[][]
10         state[0][0] = true;
11         for(int i = 1; i <= length_s1; i++){
12             state[i][0] = (s1.charAt(i - 1) == s3.charAt(i - 1)) && state[i - 1][0];
13         }//for
14         for(int i = 1; i <= length_s2; i++){
15             state[0][i] = (s2.charAt(i - 1) == s3.charAt(i - 1)) && state[0][i - 1];
16         }//for
17         
18         //fill state[][]
19         for(int i = 1; i <= length_s1; i++){
20             for(int j = 1; j <= length_s2; j++){                
21                 state[i][j] = (state[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)) || (state[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1));
22             }//for
23         }//for
24         //Util.showTwoDimensionalArray(state);
25         return state[length_s1][length_s2];
26     }
27 }

思路

这是一道二维动态规划的题

参考:http://blog.csdn.net/sunbaigui/article/details/8980830

这里state[i][j]表示s3(1..i + j )个字符是否能由s1(1, i)和s2(1, j)个字符串组成

递推公式

state[i][j] = (state[i - 1][j] && s1.charAt(i - 1) )|| (state[i][j - 1] && s2.charAt(j - 1))

如果用递归会出现超时的问题

原文地址:https://www.cnblogs.com/luckygxf/p/4260008.html