题目

交叉字符串

给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。

样例

比如 s1 = "aabcc" s2 = "dbbca"

- 当 s3 = "aadbbcbcac",返回  true.

- 当 s3 = "aadbbbaccc", 返回 false.

挑战

要求时间复杂度为O(n^2)或者更好

解题

交叉比较,不能够AC

参考这里的程序,直接运行原程序,在自己的基础上进行修改运行到78%测试数据的时候还是错了

这里给了几种失败的方法

下面只有选择动态规划来解题了

动态规划矩阵matched[l1][l2]表示s1取l1长度(最后一个字母的pos是l1-1),s2取l2长度(最后一个字母的pos是l2-1),是否能匹配s3的l1+12长度。

那么,我们有

matched[l1][l2] = s1[l1-1] == s3[l1+l2-1] && matched[l1-1][l2] || s2[l2 - 1] == s3[l1+l2-1] && matched[l1][l2-1]

边界条件是,其中一个长度为0,另一个去匹配s3.

Java

public class Solution {
/**
* Determine whether s3 is formed by interleaving of s1 and s2.
* @param s1, s2, s3: As description.
* @return: true or false.
*/
public boolean isInterleave(String s1, String s2, String s3) {
// write your code here
if(s1.length() + s2.length() != s3.length())
return false;
// if(s1.equals("")&& s2.equals(s3))
// return true;
// if(s2.equals("")&&s1.equals(s3))
// return true;
boolean[][] matched= new boolean[s1.length()+1][s2.length()+1];
matched[0][0]= true;
for(int i1=1;i1<= s1.length(); i1++){
if(s3.charAt(i1-1) == s1.charAt(i1-1))
matched[i1][0] = true;
}
for(int i2= 1;i2<= s2.length();i2++){
if(s3.charAt(i2-1) == s2.charAt(i2-1))
matched[0][i2] = true;
}
for(int i1=1;i1<=s1.length(); i1++){
char c1 = s1.charAt(i1-1);
for(int i2 = 1;i2<= s2.length();i2++){
int i3 = i1+ i2;
char c2 = s2.charAt(i2- 1);
char c3 = s3.charAt(i3 -1);
if(c1 == c3)
matched[i1][i2] =matched[i1][i2] || matched[i1-1][i2];
if( c2== c3)
matched[i1][i2] = matched[i1][i2] || matched[i1][i2-1]; }
}
return matched[s1.length()][s2.length()];
}
}

Java Code

Python

class Solution:
"""
@params s1, s2, s3: Three strings as description.
@return: return True if s3 is formed by the interleaving of
s1 and s2 or False if not.
@hint: you can use [[True] * m for i in range (n)] to allocate a n*m matrix.
"""
def isInterleave(self, s1, s2, s3):
# write your code here
len1 = len(s1)
len2 = len(s2)
len3 = len(s3)
if len1+len2 != len3:
return False
# len1 = 2
# len2 = 3
matched = [[False for i in range(len2+1)] for j in range(len1+1)] matched[0][0] = True
# print matched
for i in range(1,len1+1):
if s1[i-1]==s3[i-1]:
matched[i][0] = True
for i in range(1,len2+1):
if s2[i-1]==s3[i-1]:
matched[0][i] = True
for i1 in range(1,len1+1):
for i2 in range(1,len2+1):
i3 = i1 + i2
if s1[i1-1]==s3[i3-1]:
matched[i1][i2] = matched[i1][i2] or matched[i1-1][i2]
if s2[i2-1]==s3[i3-1]:
matched[i1][i2] = matched[i1][i2] or matched[i1][i2-1] return matched[len1][len2]

Python Code

lintcode 中等题:interleaving String 交叉字符串的更多相关文章

  1. lintcode 中等题:Intersection of Two Linked Lists 两个链表的交叉

    题目 两个链表的交叉 请写一个程序,找到两个单链表最开始的交叉节点. 样例 下列两个链表: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始交 ...

  2. lintcode 中等题: Implement Trie

    题目 Implement Trie Implement a trie with insert, search, and startsWith methods. 样例   注意 You may assu ...

  3. lintcode 中等题:minimum window substring 最小子串覆盖

    题目 最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 样例 给出source = "ADOBECODEBANC ...

  4. lintcode 中等题:Simplify Path 简化路径

    题目 简化路径 给定一个文档(Unix-style)的完全路径,请进行路径简化. 样例 "/home/", => "/home" "/a/./b ...

  5. lintcode 中等题:Letter Combinations of a Phone Number 电话号码的字母组合

    题目 电话号码的字母组合 给一个数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合. 下图的手机按键图,就表示了每个数字可以代表的字母. 样例 给定 "23" 返回 [& ...

  6. 97. Interleaving String(字符串的交替连接 动态规划)

    Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...

  7. 【Lintcode】029.Interleaving String

    题目: Given three strings: s1, s2, s3, determine whether s3 is formed by the interleaving of s1 and s2 ...

  8. 097 Interleaving String 交错字符串

    给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的.例如,给定:s1 = "aabcc",s2 = "dbbca",当 s ...

  9. lintcode 中等题:partition array 数组划分

    题目 数组划分 给出一个整数数组nums和一个整数k.划分数组(即移动数组nums中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置i, ...

随机推荐

  1. hover和mouseover,mouseout的区别

    说道hover和mouseover,mouseout的区别,不得不联系到mouseenter,mouseleave. mouseover,mouseout是指鼠标指针在穿过/离开被选元素或其子元素时触 ...

  2. js设计模式(9)---代理模式

    0.前言 KG.PP被交易到了布鲁克林篮网,我的心情很复杂,一方面为他们不能终老celtics感到惋惜,另一方面为他们能够再次冲击总冠军感到高兴.从07年以来,作为一个铁杆celtics球迷,他们给我 ...

  3. 深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复

    在某些参考资料中是说这两个方法任选其一就可,但经我测试,必须两个方法同时使用,才不会再出现错误提示 PHP Warning: strtotime(): It is not safe to rely o ...

  4. 11g RAC r2 的启停命令概述1

    目标: 熟悉主要进程的启停顺序 了解独占模式 -excl crsctl start crs与crsctl start cluster 区别 1.熟悉主要进程的启停顺序 1.1 启动节点rac1: [r ...

  5. Win10环境下的Scrapy结合Tor进行匿名爬取

    本文内容来源:http://blog.privatenode.in/torifying-scrapy-project-on-ubuntu/ 在使用Scrapy的时候,一旦进行高频率的爬取就容易被封IP ...

  6. Lambda(2)

    Lambda表达式是匿名方法的超集,处理匿名方法有的功能外,还有其他的功能: 1.能够推测出参数的类型,无需显示声明 2.支持语句块和表达式作为方法体 Lambda表达式的书写方式: Lambda表达 ...

  7. Jquery LigerUI框架学习(一)

    ligerUI框架是一个很丰富的后台框架模板,具有简洁大方的后台样式框架,还有很多灵活的控件,方便开发人员使用: 把昨天学习的成功拿出来供大家学习学习: 首先我们要去ligerUI官网下载Jquery ...

  8. java & xml parser

    参考: JDK8 API: http://docs.oracle.com/javase/8/docs/api/ DOM: http://www.w3.org/TR/2004/REC-DOM-Level ...

  9. Careercup - Google面试题 - 4716965625069568

    2014-05-06 00:17 题目链接 原题: Given a -D matrix represents the room, obstacle and guard like the followi ...

  10. 在Visual Studio中快速启动调试Web应用程序

    原文:http://blog.csdn.net/effun/article/details/2638535 到2005,Visual Studio在启动调试的功能上进行了一些改善,不过因为只是简单的一 ...