新博文地址:[leetcode]Interleaving String
建议大家看新博文,自己想的算法比本博文借鉴的算法要更容易理解。
For example,
Given:
s1 = "aabcc",
s2 = "dbbca",
When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.
题目大意: 两个字符串能否交织生成第三个串
本来这道题用递归,貌似很容易实现,但是大数据超时了,后来翻了一下本题难度系数5,实在是扮猪吃虎啊。好吧,剩下的这几道题我都不会,都需要看别人的思路。这道题有位FB大神,用了十几行代码就搞定了,下面就他的算法简单分析一下:
先贴出自己最初的代码做一个引子:
public boolean isInterleave(String s1, String s2, String s3) { if(s1.length() == 0){ if( s2.equals(s3))return true; else return false; }else if(s2.length() == 0){ if(s1.equals(s3)) return true; else return false; } if(s3.charAt(0) == s1.charAt(0) && s3.charAt(0) != s2.charAt(0)){ return isInterleave(s1.substring(1), s2, s3.substring(1)); }else if(s3.charAt(0) == s2.charAt(0) && s3.charAt(0) != s1.charAt(0)){ return isInterleave(s1, s2.substring(1), s3.substring(1)); }else if(s3.charAt(0) == s1.charAt(0) && s3.charAt(0) == s2.charAt(0)){ return isInterleave(s1.substring(1), s2, s3.substring(1)) || isInterleave(s1, s2.substring(1), s3.substring(1)); }else{ return false; } }
想法很单纯,相同的字符就delete比余下子串,如果两个都相同,分别delete,求或。但是对于大数据超时了。因此需要记录delete的中间状态省的做多余操作。DP。看到有位大神用了剪枝策略,递归搞定,感兴趣的可以戳这里(下面有人评论中提出了剪枝策略)。言归正传,本题借用了FB大神用了DP算法,原博文戳这里。
代码如下:
public boolean isInterleave(String s1, String s2, String s3) { if(s1.length() + s2.length() != s3.length()) return false; boolean[][] hash = new boolean[1000][1000]; hash[0][0] = true; for(int i = 1; i <= s1.length(); i++){ hash[0][i] = hash[0][i - 1] && (s1.charAt(i - 1) == s3.charAt(i - 1)); } for(int i = 1; i <= s2.length(); i++){ hash[i][0] = hash[i - 1][0] && (s2.charAt(i - 1) == s3.charAt(i - 1)); } for(int i = 1; i <= s2.length(); i++){ for(int j = 1; j <= s1.length(); j++){ hash[i][j] = (hash[i - 1][j] && (s2.charAt(i - 1) == s3.charAt(i + j - 1)) )|| (hash[i][j - 1] && (s1.charAt(j - 1) == s3.charAt(i + j -1))); } } return hash[s2.length()][s1.length()]; }
据我的理解,hash记录的是s1,s2到s3的可达性,这里采用了贪心的策略,尽量往后与s3匹配的。
因此有了这个:
for(int i = 1; i <= s1.length(); i++) hash[0][i] = hash[0][i - 1] && (s1.charAt(i - 1) == s3.charAt(i - 1));
还有这个
for(int i = 1; i <= s2.length(); i++) hash[i][0] = hash[i - 1][0] && (s2.charAt(i - 1) == s3.charAt(i - 1))
该初始化表示,单个字符串可以匹配的长度。
下面开始对两个字符串进行交织匹配:
for(int i = 1; i <= s2.length(); i++){ for(int j = 1; j <= s1.length(); j++){ hash[i][j] = (hash[i - 1][j] && (s2.charAt(i - 1) == s3.charAt(i + j - 1)) )|| (hash[i][j - 1] && (s1.charAt(j - 1) == s3.charAt(i + j -1))); } }
大家来看这个例子:其中s1 = aca,s2 = aab, s3 = aacaba
s2↓ s1→ | 0 | a | c | a |
0 | 1 | 1 | 1 | |
a | 1 | 1 | ||
a | 1 | |||
b | 0 |
经过初始化之后,矩阵如图所示,其中可以将1看做是一条路径,表示这条路径都是可匹配的。
hash[i - 1][j],hash[i][j - 1]表示s3中前i + j - 1已经匹配成功,其中hash[i][j - 1]表示往右匹配,例如图中红色的1,表示左边的1是匹配的,即上一步s2的a被delete了,同理hash[i - 1][j]表示上一步s1中的a被delete了。s2.charAt(i - 1) == s3.charAt(i + j - 1) 和s1.charAt(j - 1) == s3.charAt(i + j -1)不用过多解释,去寻找可以匹配s3开头的字符,如果a中的第i个字符与之匹配,则检查a的第i-1个字符是否是可达的。同理b中的匹配是一个道理。
相关推荐
在探讨LeetCode中第97题“Interleaving String”的Python解法之前,我们需要先理解题目的基本要求和背景。这道题目属于动态规划(Dynamic Programming)的经典问题,通常要求我们判断是否存在一种方式可以将两个或多...
今天我们要探讨的是LeetCode平台上的一道中等难度的问题——“Interleaving String”,即交错字符串问题,具体到“97-interleaving-string.js”这个文件,它包含了使用JavaScript语言对该问题的解答。 ...
0097题,即“Interleaving String”,要求解者判断是否存在一种方法,能够将两个字符串s3,s1和s2交织成s3。具体来说,这个问题是这样的:给定三个字符串s1、s2和s3,判断s3是否是由s1和s2交织而成。交织是指s3中的...
在LeetCode平台上,字符串(String)专题是编程爱好者和求职者经常练习的重要部分。这个专题涵盖了字符串处理的各种算法问题,旨在提升编程者对字符串操作的熟练度和理解。在这个压缩包中,"LeetCode-String-master"很...
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input ...
在这个特定的示例中,我们关注的是一个名为"perform-string-shifts.c"的C语言文件,该文件包含了一个解决特定LeetCode问题的代码实现。为深入理解其内容,我们将从以下几个方面进行探讨: 1. LeetCode平台与题库:...
Reverse words in a string-leetcode
"interleaving_string.erl","search_insert_position.erl", "three_sum.erl","trapping_rain_water.erl", "valid_palindrome.erl" 个人认为dungeon_game这个题目解题逻辑很体现erlang的函数式的思维逻辑
《LeetCode 101 - A LeetCode Grinding Guide (C++ Version)》是一本专为C++程序员设计的深入解析LeetCode算法问题的指南。这本书采用彩色版,以直观的方式讲解了各种数据结构和算法,旨在帮助读者磨练编程技能,...
java入门 java_leetcode题解之008_String_to_Integer(atoi)
《使用leetcode-editor在IDE中进行LeetCode练习的全方位指南》 LeetCode是一个广受欢迎的在线编程练习平台,它提供了一系列的算法题目供程序员们提升技能。对于习惯在集成开发环境(IDE)中工作的开发者来说,将...
《Python版LeetCode题解全集详解》 LeetCode是一个广受欢迎的在线编程挑战平台,致力于帮助程序员提升技能,特别是面试准备。这个压缩包“lc-all-solutions-master”包含了使用Python语言解决LeetCode所有问题的...
"IDEA leetcode-editor插件"就是将这两者结合的工具,允许用户在IDEA中直接进行LeetCode的编程挑战,无需离开开发环境,提高了刷题的便捷性。 该插件的主要功能包括: 1. **离线模式**:在无法访问LeetCode官网的...
vs code LeetCode 插件
Java的String类提供了丰富的API来处理字符串。 2. **链表**: - 链表题目通常涉及节点的插入、删除和遍历。Java中的LinkedList类提供了链表操作的基础,但解题时往往需要自定义节点类。 3. **栈与队列**: - 栈...
terminal-leetcode, 终端Leetcode是基于终端的Leetcode网站查看器 终端 leetcode终端leetcode是基于终端的leetcode网站查看器。本项目是由 RTV 激发的。 我最近正在学习本地化的反应,以实践我的新知识,并根据这个...
(C++)LeetCode刷题题解答案
leetcode Fighting for a job! 记录找工作期间搬运的题,全部使用Java实现,本人C++鶸 1 双指针 编号 题目 LeetCode 11 Container With Most Water LeetCode 19 Remove Nth Node From End of List LeetCode 42 ...
leetcode刷题, 直接用leetcode的分类方式.
python python_leetcode题解之087_Scramble_String