Interleaving String
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.
利用动态规划的思想: dp[i][j] = (s[i+j-1] == s1[i-1] && dp[i-1][j] ) || (s[i+j-1] == s2[j-1] && dp[i][j-1])
dp[i][j] 表示s1中的前i位和s2中的前j位是否可以组成s3的前i+j位,其中表示时要注意下标,dp[i][j] 则在s3中为i+j-1
代码为:
- public boolean isInterleave(String s1, String s2, String s3) {
- int sz1 = s1.length();
- int sz2 = s2.length();
- int sz3 = s3.length();
- if(sz3 != sz1 + sz2) return false;
- boolean[][] flag = new boolean[sz1+1][sz2+1];
- for(int i=0;i<=sz1;i++)
- for(int j=0;j<=sz2;j++) {
- flag[i][j]=false;
- }
- flag[0][0]=true;
- for(int i=1;i<=sz1;i++) {
- if(s1.charAt(i-1)==s3.charAt(i-1)&&flag[i-1][0])
- flag[i][0]=true;
- }
- for(int i=1;i<=sz2;i++) {
- if(s2.charAt(i-1)==s3.charAt(i-1) && flag[0][i-1])
- flag[0][i]=true;
- }
- for(int i=1;i<=sz1;i++) {
- for(int j=1;j<=sz2;j++) {
- if(s3.charAt(i+j-1)==s1.charAt(i-1) && flag[i-1][j]) {
- flag[i][j]=true;
- }
- if(s3.charAt(i+j-1)==s2.charAt(j-1) && flag[i][j-1]) {
- flag[i][j]=true;
- }
- }
- }
- return flag[sz1][sz2];
- }
c++代码为:
- bool isInterleave(string s1, string s2, string s3) {
- if(s1.size() + s2.size() != s3.size()) return false;
- bool dp[s1.size()+1][s2.size()+1]; // represent the pre-s1.size and the s2.size interleave
- int i,j;
- for(i=0;i<s1.size()+1;i++)
- for(j=0;j<s2.size()+1;j++)
- dp[i][j] = false;
- dp[0][0] = true;
- for(i=1;i<s1.size()+1;i++) {
- if(s1.at(i-1) == s3.at(i-1) && dp[i-1][0]) {
- dp[i][0] = true;
- }
- }
- for(j=1;j<s2.size()+1;j++) {
- if(s2.at(j-1) == s3.at(j-1) && dp[0][j-1]) {
- dp[0][j] = true;
- }
- }
- for(i=1;i<s1.size()+1;i++) {
- for(j=1;j<s2.size()+1;j++) {
- if(s1.at(i-1) == s3.at(i+j-1) && dp[i-1][j]) {
- dp[i][j] = true;
- }
- if(s2.at(j-1) == s3.at(i+j-1) && dp[i][j-1]) {
- dp[i][j] = true;
- }
- }
- }
- return dp[s1.size()][s2.size()];
- }

浙公网安备 33010602011771号