热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[Leetcode]InterleavingString

Givens1,s2,s3,findwhethers3isformedbytheinterleavingofs1ands2.Forexample,Given:s1aabcc

 


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.

 

[解题思路]

DP

Let F(i, j) denote if s1 of length i and s2 of length j could form s3 of
lenght i+j, then we have four cases:
(1) F(i, j) = F(i-1,
j)                             
if s1[i-1] == s3[i+j-1] && s2[j-1] != s3[i +j -1]
(2) F(i, j) = F(i,
j-1)                    
         if s1[i-1] != s3[i+j-1]  &&
s2[j-1] == s3[i +j -1]
(3) F(i, j) = F(i-1, j) || F(i,
j-1)             if
s1[i-1] == s3[i+j-1] && s2[j-1] == s3[i +j -1]
(4) F(i, j) =
false                    
              if s1[i-1] != s3[i+j-1]
&& s2[j-1] != s3[i +j -1]

 

 

但是merge sort没法考虑两个字符串的组合顺序问题。当处理{"C","CA",
"CAC"}的时候,就不行了。


最后还是得用DP。对于
s1 = a1, a2
........a(i-1), ai

s2 = b1, b2, .......b(j-1),
bj

s3 = c1, c3, .......c(i+j-1), c(i+j)

 

定义 match[i][j] 意味着,S1的(0, i)和S2的(0,j),匹配与S3的(i+j)
如果 ai
== c(i+j), 那么 match[i][j] = match[i-1][j], 等价于如下字符串是否匹配。


s1
= a1, a2 ........a(i-1)

s2 = b1, b2, .......b(j-1),
bj

s3 = c1, c3, .......c(i+j-1)

同理,如果bj =
c(i+j), 那么match[i][j] = match[i][j-1];


所以,转移方程如下:

Match[i][j]
= (s3.lastChar == s1.lastChar) && Match[i-1][j]
||(s3.lastChar == s2.lastChar) && Match[i][j-1]
初始条件:
i=0 && j=0时,Match[0][0] = true;
i=0时, s3[j] = s2[j], Match[0][j] |= Match[0][j-1]
s3[j] != s2[j], Match[0][j] = false;
j=0时, s3[i] = s1[i], Match[i][0] |= Match[i-1][0]
s3[i] != s1[i], Match[i][0] = false;



public class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
// Start typing your Java solution below
// DO NOT write main() function
int len1 = s1.length(), len2 = s2.length(), len3 = s3.length();
if(len3 != len1 + len2){
return false;
}

boolean[][] match = new boolean[len1 + 1][len2 + 1];
match[
0][0] = true;

// j == 0
int i = 1;
while(i <= len1 && s1.charAt(i-1) == s3.charAt(i-1)){
match[i][
0] = true;
i
++;
}

// i == 0
int j = 1;
while(j <= len2 && s2.charAt(j-1) == s3.charAt(j-1)){
match[
0][j] = true;
j
++;
}

for(int m = 1; m <= len1; m++){
for(int n = 1; n <= len2; n++){
char c = s3.charAt(m + n - 1);
if(c == s1.charAt(m - 1)){
match[m][n]
|= match[m-1][n];
}
if(c == s2.charAt(n - 1)){
match[m][n]
|= match[m][n-1];
}
}
}
return match[len1][len2];
}
}

ref: http://www.cnblogs.com/feiling/p/3296057.html  
&& http://fisherlei.blogspot.com/2012/12/leetcode-interleaving-string.html


推荐阅读
  • ProblemDescription:Readtheprogrambelowcarefullythenanswerthequestion.#pragmacomment(linker ... [详细]
  • -(void)drawRect:(CGRect)rect{获得当前上下文CGContextRefctxUIGraphicsGetCurrentContext();把当前上下文状态保 ... [详细]
  • 调用:视图调用:1@Html.DropDownListFor(tt.HrEmpGuid,ViewData[Emp] as SelectList, new {@class   ... [详细]
  • socket8 [命名管道]
    ::命名管道不但能实现同一台机器上两个进程通信,还能在网络中不同机器上的两个进程之间的通信机制。与邮槽不同,命名管道是采用基于连接并且可靠的传输方式,所以命名管道传输数据只能一对一 ... [详细]
  • Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理,现在在企业中的使用率也是很广的。git是一个分布式的版本控制系统,不像以前的svn,svn是 ... [详细]
  • 模仿邮件登录系统
    模仿邮件登录系统码云代码库:https:gitee.compinaomansgiteemail_login.git实验结果图:验证用户名、密码不能为空,并提示用户名或密码错误提示用 ... [详细]
  • Postman工具使用教程
    Postman的基础功能1.GET请求GET请求:点击Params,输入参数及value,可输入多个,即时显示在URL链接上,所以,GET请求的请求头与请求参数如在接口文档中无特别 ... [详细]
  • 1.EF跟LINQ不是一码事儿。2.LINQtoEF是LINQ的一个provider,LINQtoSQL也是LINQ的一个provider。LINQtoEF是LINQtoSQL的替 ... [详细]
  • Matplotlib笔记:设置画布属性并保存图片(figsize,dpi,savefig)
    设置画布属性并保存图片importmatplotlib.pyplotaspltplt.figure(figsize(10,4),dpi80)#图片长宽和清晰度plt.p ... [详细]
  • 内存暴增排查分析
    一次偶然间,发现测试环境iis站点内存突然间暴增,平常都是300M,这次一下子暴增到8g于是就开始了接下来的分析发现Dictionary居然有1.78g懵逼windbg分析1.看看 ... [详细]
  • 1011-MarriageCeremoniesPDF(English)StatisticsForumTimeLimit:2second(s)MemoryLimit:32MBYouw ... [详细]
  • AtCoder Beginner Contest 176   EBomber   (思维)
    题意:有一张$H$x$W$的图,给你$M$个目标的位置,你可以在图中放置一枚炸弹,炸弹可以摧毁所在的那一行和一列,问最多可以摧毁多少目标.题解:首先我们记录某一行和某一列目标最多的 ... [详细]
  • MainActivity如下:packagecc.testview1;importandroid.os.Bundle;importandroid.app.Activity ... [详细]
  • diskmark使用教程
    首先说明一下软件各个参数的意义。1~9测试次数;50MB~4000MB测试规模;C,D,E,F选择测试对象;ALL测试以下所有;第一行代表你硬盘的读写速度。第二行代表你硬盘4K文件 ... [详细]
  • iOS Auto Layout Demystify
    BookDescripterAutoLayouttransformsthewayyoucreateiOSuserinterfaces.Asflexibleasitispowerfu ... [详细]
author-avatar
最好的冰雪之母_227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有