给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
例如,
给定:
s1 = "aabcc",
s2 = "dbbca",
当 s3 = "aadbbcbcac", 返回 true.
当 s3 = "aadbbbaccc", 返回 false.
详见:https://leetcode.com/problems/interleaving-string/description/

Ø d b b c a
Ø T F F F F F
a T F F F F F
a T T T T T F
b F T T F T F
c F F T T T T
c F F F T F T

字符串s1和s2的长度和必须等于s3的长度,如果不等于,肯定返回false。那么当s1和s2是空串的时候,s3必然是空串,则返回true。所以直接给dp[0][0]赋值true,然后若s1和s2其中的一个为空串的话,那么另一个肯定和s3的长度相等,则按位比较,若相同且上一个位置为True,赋True,其余情况都赋False,这样的二维数组dp的边缘就初始化好了。在任意非边缘位置dp[i][j]时,它的左边或上边有可能为True或是False,两边都可以更新过来,只要有一条路通着,那么这个点就可以为True。那么分别来看,如果左边的为True,那么去除当前对应的s2中的字符串s2[j - 1] 和 s3中对应的位置的字符相比(计算对应位置时还要考虑已匹配的s1中的字符),为s3[j - 1 + i], 如果相等,则赋True,反之赋False。 而上边为True的情况也类似,所以可以求出递推公式为:
dp[i][j] = (dp[i - 1][j] && s1[i - 1] == s3[i - 1 + j]) || (dp[i][j - 1] && s2[j - 1] == s3[j - 1 + i]);
其中dp[i][j] 表示的是 s2 的前 i 个字符和 s1 的前 j 个字符是否匹配 s3 的前 i+j 个字符。

Java实现:

class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int m=s1.length();
int n=s2.length();
if(m+n!=s3.length()){
return false;
}
boolean[][] path=new boolean[m+1][n+1];
for(int i=0;i<m+1;++i){
for(int j=0;j<n+1;++j){
if(i==0&&j==0){
path[i][j]=true;
}else if(i==0){
path[i][j]=path[i][j-1]&&(s2.charAt(j-1)==s3.charAt(j-1));
}else if(j==0){
path[i][j]=path[i-1][j]&&(s1.charAt(i-1)==s3.charAt(i-1));
}else{
path[i][j] = (path[i][j-1] && (s2.charAt(j-1)==s3.charAt(i+j-1)))
|| (path[i-1][j] && (s1.charAt(i-1)==s3.charAt(i+j-1)));
}
}
}
return path[m][n];
}
}

参考:https://www.cnblogs.com/grandyang/p/4298664.html

最新文章

  1. 微软亚洲实验室一篇超过人类识别率的论文:Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification ImageNet Classification
  2. requests模块--python发送http请求
  3. C++的优秀特性4:指针
  4. 几种通讯协议的比较RMI &gt; Httpinvoker &gt;= Hessian &gt;&gt; Burlap &gt;&gt; web service
  5. UI基础视图----UIWebView总结
  6. js获取某个标签中的信息
  7. JavaScript的原型
  8. php不同形式的实现a-z的26个字母的输出
  9. Elixir游戏服设计四
  10. Pyhton编程(三)之Pycharm安装及运算符
  11. 记录python接口自动化测试--从excel中读取params参数传入requests请求不生效问题的解决过程(第七目)
  12. AJAX from S3 CORS fails on preflight OPTIONS with 403
  13. 如何让vue自定义组件可以包裹内容,并且渲染出来,以及组件的组合使用
  14. css实现标题左右横线
  15. centos7虚拟机克隆后设置固定IP
  16. java中接口和抽象类的异同点
  17. codeforces618B
  18. Android视图动画集合AndoridViewAnimations
  19. iOS开发之资料收集
  20. Java API获取consumer group最新提交位移的时间

热门文章

  1. RobotFramework教程使用笔记——RIDE的相关知识及Resources创建关键字文件
  2. servlet串行拦截器实现例子
  3. laravel基础课程---2、Laravel配置文件、路由及php artisan(php artisan是什么)
  4. AJAX获取数据,需要添加事件
  5. Spring创建对象的三种方式以及创建时间
  6. org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;bireportSqlSessionFactory&#39; defined in URL
  7. shell编程流程控制
  8. jQuery 生成随机字符
  9. 前端开发利器 Sublime Text 3 使用技巧和总结笔记
  10. 细说CSS中的display属性