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); }
阅读全文
0 0
- LeetCode: Interleaving String
- LeetCode Interleaving String
- LeetCode: Interleaving String
- [Leetcode] Interleaving String
- [LeetCode] Interleaving String
- leetcode 68: Interleaving String
- [Leetcode] Interleaving String
- LeetCode - Interleaving String
- [LeetCode]Interleaving String
- LeetCode: Interleaving String
- Leetcode: Interleaving String
- [Leetcode]Interleaving String
- Leetcode: Interleaving String
- LeetCode:Interleaving String
- LeetCode-Interleaving String
- [leetcode] Interleaving String@DP
- LeetCode:Interleaving String
- LeetCode - Interleaving String
- angular
- Java中 Object类有哪些公用方法?
- PullToRefreshScrollView+ViewPager+MyListView
- Java基础总结
- opencv 基于内容的视频关键帧提取(以HSV总量为特征量)
- Leetcode:Interleaving String
- C语言中指针数组作为参数传递修改内容
- 修改密码
- 基于Dubbo的分布式系统架构(六):Dubbo负载均衡策略
- ImageLoader
- Android studio动画
- Activity中的数据传递
- angularjs实现购物车
- 就地逆置