[leetcode-97]Interleaving String(java)
2015-08-11 10:24
615 查看
问题描述:
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.
分析:这道题,我觉得是比较难的。我最开始的想法是使用递归,但是觉得递归可能会超时,就利用两个指针吗,齐头并进,当遇到二者相等时,就把中间状态存到栈里面。如果以后走不通了,就出栈,恢复状态。再继续查找,恢复等等,当数据小规模时,可以work,但是数据量一大就TLE。
于是使用二维DP算法(早该想到)。其核心的状态转移方程为:
f(i,j) = s1[i-1][j]==s3[i+j-1] && f[i-1,j] || (s2[i][j-1]==s3[i+j-1] && f[i][j-1])
代码如下:324ms
代码1:TLE
代码2:递归TLE
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.
分析:这道题,我觉得是比较难的。我最开始的想法是使用递归,但是觉得递归可能会超时,就利用两个指针吗,齐头并进,当遇到二者相等时,就把中间状态存到栈里面。如果以后走不通了,就出栈,恢复状态。再继续查找,恢复等等,当数据小规模时,可以work,但是数据量一大就TLE。
于是使用二维DP算法(早该想到)。其核心的状态转移方程为:
f(i,j) = s1[i-1][j]==s3[i+j-1] && f[i-1,j] || (s2[i][j-1]==s3[i+j-1] && f[i][j-1])
代码如下:324ms
[code]public class Solution { public boolean isInterleave(String s1, String s2, String s3) { int row = s1.length(); int col = s2.length(); int length = s3.length(); if(row+col!=length) return false; if(row==0) return s2.equals(s3); else if(col==0) return s1.equals(s3); boolean[][] matrix = new boolean[row+1][col+1]; matrix[0][0] = true; for(int i = 0;i<=row;i++){ for(int j = 0;j<=col;j++){ if(i>0){ matrix[i][j] = s1.charAt(i-1)==s3.charAt(i+j-1) && matrix[i-1][j]; } if(j>0) matrix[i][j] |= s2.charAt(j-1)==s3.charAt(i+j-1) && matrix[i][j-1]; } } return matrix[row][col]; } }
代码1:TLE
[code] class Node{ int index1; int index2; int index3; public Node(int index1,int index2,int index3){ this.index1 = index1; this.index2 = index2; this.index3 = index3; } } public boolean isInterleave2(String s1, String s2, String s3) { int s1Len = s1.length(); int s2Len = s2.length(); int index1=0,index2=0,index3 = 0; Stack<Node> nodes = new Stack<>(); char[] s1Array = s1.toCharArray(); char[] s2Array = s2.toCharArray(); char[] s3Array = s3.toCharArray(); while(index1<s1Len || index2<s2Len){ if( (index1>=s1Len || s3Array[index3]!=s1Array[index1]) && (index2>=s2Len ||s3Array[index3] != s2Array[index2])){ if(nodes.empty()) return false; Node tmpNode = nodes.pop(); index1 = tmpNode.index1; index2 = tmpNode.index2; index3 = tmpNode.index3; index2++;index3++; } else{ if(index1<s1Len && s3Array[index3]==s1Array[index1]){ if(index2<s2Len && s1Array[index1]==s2Array[index2]){ Node node = new Node(index1,index2,index3); nodes.push(node); } index1++; index3++; }else if(index2<s2Len && s3Array[index3]==s2Array[index2]) { index2++; index3++; }else return false; } } return true; }
代码2:递归TLE
[code]//使用递归的思想来进行 public boolean isInterleave(String s1, String s2, String s3) { if(s1.length()<=0) return s2.equals(s3); if(s2.length()<=0) return s1.equals(s3); if(s3.length()<=0) return false; if(s1.charAt(0)==s3.charAt(0)&&s2.charAt(0)!=s3.charAt(0)) return isInterleave(s1.substring(1),s2,s3.substring(1)); else if(s2.charAt(0)==s3.charAt(0)&&s1.charAt(0)!=s3.charAt(0)) return isInterleave(s1,s2.substring(1),s3.substring(1)); else if(s1.charAt(0)==s2.charAt(0)&&s1.charAt(0)==s3.charAt(0)){ return isInterleave(s1.substring(1),s2,s3.substring(1))||isInterleave(s1,s2.substring(1),s3.substring(1)); }else return false; }
相关文章推荐
- 根据日期,转换成星座、生肖工具类
- spring管理事物(增删改的事物回滚等)
- 搭建Java Web项目 Maven管理jar包
- JDK环境变量配置方法详解
- Java实现图的深度和广度优先遍历算法
- Java实现图的深度和广度优先遍历算法
- Java Serializable(序列化)的理解和总结、具体实现过程(转)
- JAVA 压缩文件和解压文件
- java学习笔记:JDBC基础——JDBC创建的六个步骤
- 【Java设计模式】· 解释器模式(Interpreter Pattern)
- jdk从1.7升级到1.8之后启动出错解决
- 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
- Java的第一个程序与XSS简介
- 【Java】(4)Java注解
- Spring中使用Quartz两种实现方式
- JDK环境变量配置
- Java I/O 操作及优化建议
- spring多数据源的配置
- Servlet+jsp+javabean+连接数据库
- Mac下打开多个Eclipse