今天面试官给出了一道题,判断字符串s是否能够由arr中的元素组合拼接组成。
输入示例:
s="aabbcc"
arr=["a","abb","c"]
其实还挺简单的递归法的题目,太紧张然后写错边界条件。
递归法两个注意点:
1.字符串的边界条件
2.遍历过程中只要有一次true,最后结果就是true
时间复杂度:O(n)
空间复杂度:O(1)
代码如下:
class Solution(object):
def mergeStr(self,s,arr):
if len(s)==0:
return True
start=0
flag=False
for i in range(1,len(s)+1):
cur=s[start:i]
if cur in arr:
res=self.mergeStr(s[i:],arr)
if res:
flag=res
return flag
if __name__=='__main__':
s="aabbcc"
arr=["a","abb","cc"]
solution=Solution()
res=solution.mergeStr(s,arr)
print(res)
其实和找零钱挺像的,但是太紧张了。边界条件其实面试时发现错了,i属于[1,len(s)+1),但面试官小姐姐一质疑就不敢改了。交流还是很重要。
更新:在Leetcode上找到这个题,发现回溯法是会超时的
更新动态规划法:
时间复杂度:O(n^2)
空间复杂度:O(n)
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
dp=[False for _ in range(len(s)+1)]
dp[0]=True
for i in range(len(s)+1):
for j in range(i):
if dp[j] and s[j:i] in wordDict:
dp[i]=True
break
return dp[-1]