29. Interleaving String
Given three strings: s1, s2, s3, determine whether s3 is formed by the interleaving of s1 and s2.
Example
For s1 = "aabcc"
, s2 = "dbbca"
- When s3 =
"aadbbcbcac"
, returntrue
. - When s3 =
"aadbbbaccc"
, returnfalse
.
Challenge
O(n2) time or better
Code
法一:(递归)
class Solution:
"""
@param s1: A string
@param s2: A string
@param s3: A string
@return: Determine whether s3 is formed by interleaving of s1 and s2
"""
def isInterleave(self, s1, s2, s3):
# write your code here
if s1 is None or s2 is None or s3 is None:
return False
if len(s1) + len(s2) != len(s3):
return False
interleave = [[False]*(len(s2)+1) for i in range(len(s1)+1)]
interleave [0][0] = True
for i in range(len(s1)):
interleave[i+1][0] = s1[:i+1] == s3[:i+1]
for j in range(len(s2)):
interleave[0][i+1] = s2[:i+1] == s3[:i+1]
for i in range(len(s1)):
for j in range(len(s2)):
interleave[i+1][j+1] = False
if s1[i]==s3[i+j+1]:
interleave[i+1][j+1] = interleave[i][j+1]
if s2[j] == s3[i+j+1]:
interleave[i+1][j+1] = interleave[i+1][j]
return interleave[len(s1)][len(s2)]
class Solution:
"""
@param s1: A string
@param s2: A string
@param s3: A string
@return: Determine whether s3 is formed by interleaving of s1 and s2
"""
def isInterleave(self, s1, s2, s3):
# write your code here
return self._isInterleave(s3, 0, s1, 0, s2, 0)
def _isInterleave(self, s3, s3_start, s1, s1_start, s2, s2_start):
if (s3_start == len(s3)) and (s1_start == len(s1)) and (s2_start == len(s2)):
return True
if (s1_start < len(s1)) and (s3[s3_start] == s1[s1_start]):
if self._isInterleave(s3, s3_start + 1, s1, s1_start + 1, s2, s2_start):
return True
if (s2_start < len(s2)) and (s3[s3_start] == s2[s2_start]):
if self._isInterleave(s3, s3_start + 1, s1, s1_start, s2, s2_start + 1):
return True
return False
法二 :(非递归)从s1和s2入手:求s1和s2的组合,太暴力。那就s3入手,第一反应就是对于s3中的每个字母肯定不是在s1就是在s2当中,那么用一个for或while循环遍历s3,每次循环判断当前字母是否在s1或者s2当中,两者都没有就肯定不是“交叉字符串”,返回False;如果循环结束就返回True。发现每次循环中我都是先判断s1中有没有元素匹配,如果s2当中也有匹配元素呢,在else当中,不应该直接返回False,而应该回溯,回溯到一开始上一次匹配的地方,即s1[i]==s3[k]相等的地方,不过这次不能拿s1和s3比,而应该拿s2和s3比。
class Solution:
"""
@param s1: A string
@param s2: A string
@param s3: A string
@return: Determine whether s3 is formed by interleaving of s1 and s2
"""
def isInterleave(self, s1, s2, s3):
# write your code here
i = 0
j = 0
k = 0
# 标记与s1还是s2比较
flag = 0
while k < len(s3):
if i < len(s1) and s3[k] == s1[i] and flag==0:
i += 1
k += 1
elif j < len(s2) and s3[k] == s2[j]:
j += 1
k += 1
flag = 0
# 回溯
else:
i = i-1
if i <= 0:
return False
k = k - 1
# 与s2比较
flag = 1
return True