Leetcode:Interleaving String

来源:互联网 发布:linux 杀死进程 编辑:程序博客网 时间:2024/06/12 20:40

Url:

https://leetcode.com/problems/interleaving-string/description/

描述:

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.

解析:

本题有两种解法,深度优先搜索和动态规划。
1.深度优先搜索
i1,i2,i3分别指向字符串s1,s2,s3的当前位置,则以下情况:
当s1[i1] == s3[i3]时 ,递归遍历i1+1,i2,i3
当s2[i2]==s3[i3]时,递归遍历i1,i2+1,i3
终止的条件是i3==s3.length
注意:使用剪枝,避免重复递归。
2.动态规划
动态规划的公式是:
dp[i][j]的值取决于:
dp[i-1][j] && s1.charAt(i)==s3.charAt(i+j) 或者
dp[i][j-1] && s2.cahrAt(j) == s3.charAt(i+j)

下面给出代码:

boolean dfs(String s1, String s2, String s3,int i1,int i2,int i3,boolean [][]cache) {        if(i3==s3.length()) return true;        if(i1<s1.length()&&i2<s2.length()){            if(!cache[i1][i2])                return false;        }        boolean flag1 = false,flag2 = false;        if(i1!=s1.length()&&s1.charAt(i1)==s3.charAt(i3)){            flag1 = dfs(s1,s2,s3,i1+1,i2,i3+1,cache);            if(flag1) return true;        }        if(i2!=s2.length()&&s2.charAt(i2)==s3.charAt(i3)){            flag2 = dfs(s1,s2,s3,i1,i2+1,i3+1,cache);            if(flag2) return true;        }        if(i1<s1.length()&&i2<s2.length()){            cache[i1][i2] = false;        }        return false;    }    boolean dp(String s1,String s2,String s3){        boolean[][] dp = new boolean[s1.length()+1][s2.length()+1];        dp[0][0] = true;        //对于位置为0进行初始化,也是就只有s1字符串,dp[][]的数值,下一个for循环同理只有s2的情况        for(int i=1;i<=s1.length();i++){            dp[i][0] = dp[i-1][0] && s3.charAt(i-1)==s1.charAt(i-1);        }        for(int i=1;i<=s2.length();i++){            dp[0][i] = dp[0][i-1] && s3.charAt(i-1)==s2.charAt(i-1);        }        for(int i=1;i<=s1.length();i++){            for(int j=1;j<=s2.length();j++){                dp[i][j] = (s1.charAt(i-1) == s3.charAt(i+j-1) && dp[i-1][j])                        || (s2.charAt(j-1) == s3.charAt(i+j-1) && dp[i][j-1]);            }        }        return dp[s1.length()][s2.length()];    }

leetcode的接口如下

public boolean isInterleave(String s1, String s2, String s3) {        if(s1.length()+s2.length()!=s3.length())             return false;        return dp(s1,s2,s3);    }

或者

public boolean isInterleave(String s1, String s2, String s3) {        if(s1.length()+s2.length()!=s3.length())            return false;        if(s1.length()==0){            return s2.equals(s3);        }        if(s2.length()==0){            return s1.equals(s3);        }//cache做剪枝使用,避免重复递归,这里初始化为true,当设置为false时,则无需再递归        boolean[][] cache = new boolean [s1.length()][s2.length()];        for(int i=0;i<s1.length();i++){            Arrays.fill(cache[i],true);        }        return dfs(s1,s2,s3,0,0,0,cache);    }
原创粉丝点击