Leetcode No.97 交错字符串
一、题目描述
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。
两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:
s = s1 + s2 + ... + sn t = t1 + t2 + ... + tm |n - m| <= 1 交错 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ... 提示:a + b 意味着字符串 a 和 b 连接。
示例 1:
输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac" 输出:true
示例 2: 输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc" 输出:false
示例 3: 输入:s1 = "", s2 = "", s3 = "" 输出:true
提示:
0 <= s1.length, s2.length <= 100 0 <= s3.length <= 200 s1、s2、和 s3 都由小写英文字母组成
二、解题思路
首先如果 |s1| + |s2| != |s3|,那 s3必然不可能由 s1和 s2交错组成。 在 |s1| + |s2| = |s3|时,我们可以用动态规划来求解。 我们定义 f(i, j)表示 s1的前 i 个元素和 s2的前 j 个元素是否能交错组成 s3的前 i+j 个元素。 如果 s1的第 i 个元素和 s3的第 i + j 个元素相等,那么 s1的前 i 个元素和 s2的前 j 个元素是否能交错组成s3的前 i + j个元素取决于 s1的前 i - 1个元素和 s2的前 j 个元素是否能交错组成 s3的前 i + j - 1个元素, 即此时 f(i, j) 取决于 f(i - 1, j),在此情况下如果 f(i - 1, j) 为真,则 f(i, j) 也为真。 同样的,如果 s2的第j 个元素和 s3的第 i + j个元素相等并且 f(i, j - 1)为真,则 f(i, j) 也为真。 于是我们可以推导出这样的动态规划转移方程: f(i,j)=[f(i−1,j) && s1(i−1)=s3(p)] || [f(i,j−1) && s2(j−1)=s3(p)] 其中 p = i + j - 1。边界条件为f(0,0)=True。
三、代码
public class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int n1=s1.length();
int n2=s2.length();
int n3=s3.length();
if(n1+n2!=n3){
return false;
}
boolean[][] bool=new boolean[n1+1][n2+1];
bool[0][0]=true;
for(int i=0;i<=n1;i++){
for(int j=0;j<=n2;j++){
int p=i+j-1;
if(i>0){
bool[i][j]=bool[i][j]||bool[i-1][j]&&s1.charAt(i-1)==s3.charAt(p);
}
if(j>0){
bool[i][j]=bool[i][j]||bool[i][j-1]&&s2.charAt(j-1)==s3.charAt(p);
}
}
}
return bool[n1][n2];
}
public static void main(String[] args) {
Solution solution=new Solution();
String s1="aabcc";
String s2="dbbca";
String s3="aadbbcbcac";
System.out.println(solution.isInterleave(s1,s2,s3));
}
}
四、复杂度分析
时间复杂度和空间复杂度都是 O(nm),其中n是字符串s1的长度,m是字符串s2的长度。
相关文章
- 金融服务领域的大数据:即时分析
- 影响大数据、机器学习和人工智能未来发展的8个因素
- 从0开始构建一个属于你自己的PHP框架
- 如何将Hadoop集成到工作流程中?这6个优秀实践必看
- SEO公司使用大数据优化其模型的5种方法
- 关于Web Workers你需要了解的七件事
- 深入理解HTTPS原理、过程与实践
- 增强分析:数据和分析的未来
- PHP协程实现过程详解
- AI专家:大数据知识图谱——实战经验总结
- 关于PHP的错误机制总结
- 利用数据分析量化协同过滤算法的两大常见难题
- 怎么做大数据工作流调度系统?大厂架构师一语点破!
- 2019大数据处理必备的十大工具,从Linux到架构师必修
- OpenCV中的KMeans算法介绍与应用
- 教大家如果搭建一套phpstorm+wamp+xdebug调试PHP的环境
- CentOS下三种PHP拓展安装方法
- Go语言HTTP Server源码分析
- Go语言HTTP Server源码分析
- 2017年4月编程语言排行榜:Hack首次进入前五十