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, 过程如下图所示:

                            S2

S1

aadbbcbcac

0 “”

1 d

2 db

3 dbb

4 dbbc

5 dbbca

0 “”

T

F(d!=a)

F

F

F

F

1 a

T(a==a)

F(aa)

F

F

F

F

2 aa

T

T(aad)

T(aadb)

3 aab

F(aab!=aad)

T(aadb)

T(aadbb)

4 aabc

F

F(aadbb)

T(aadbbc)

5 aabcc

F

F(aadbbc)

发现某一格dp[i][j]为true只有当其上面或左边为true才行。且需要新加入的字母与s3新添加的字母一致,True状态才能延续。

代码:

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

简化为一维数组:

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

最新文章

  1. 练习:python 操作Mysql 实现登录验证 用户权限管理
  2. 解决java.io.IOException: HTTPS hostname wrong: should be
  3. Java线程间通信方式剖析——Java进阶(四)
  4. [Android基础论]为何Activity退出之后,系统没有调用onDestroy方法?
  5. Restful.Data v1.0 - 轻量级数据持久层组件, 正式开源发布了
  6. SQL Server代理(7/12):作业活动监视器
  7. ettercap ARP dns 欺骗
  8. scala学习笔记(4):占位符
  9. 实用CSS3属性之 :target伪类实现Tab切换效果
  10. 用QT创建WINDOWS服务程序
  11. 【源码】canal和otter的高可靠性分析
  12. springboot + redis缓存使用
  13. Python图片爬虫
  14. VISUALSVN: UNABLE TO CONNECT TO A REPOSITORY AT URL 无法连接主机的解决办法
  15. 单片机如何产生PWM信号
  16. React——event
  17. 洛谷 p2066 机器分配(资源型)
  18. 计算广告学-多点归因模型(Multi-Touch Attribution Model)
  19. centos 阶段复习 2015-4-6 dd命令 hosts.allow和hosts.deny 啊铭的myssh脚本 清空history命令历史 /dev/zero 零发生器 /dev/null 黑洞 /dev/random 生成随机数 第十一节课
  20. MVC3 之asp.net 与vb.net 互转练习

热门文章

  1. cinder节点部署
  2. ASP.NET应用中会话状态丢失及解决策略
  3. MINA系列学习-IoAccpetor
  4. getWinSystemIcon
  5. HR常用事务代码
  6. django搭建论坛之一环境配置
  7. 这有一个flag
  8. 刨一刨内核container_of()的设计精髓
  9. [OSI]网络间通信流程
  10. 使用TFS 自动编译时的一点设置