leetcode 刷题140 141
生活随笔
收集整理的這篇文章主要介紹了
leetcode 刷题140 141
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
動態規劃我認為最難的算法
學習別人的代碼
class Solution:def wordBreak(self, s: str, wordDict: list) -> list:"""這里其實借用了上一題的函數,如果有解才進行遞歸搜索但是實際上在動態規劃的時候已經進行了一次搜索,就是在動態規劃的時候不好出結果而且但是測試例里面有不能分割的,如果過程中進行保存操作反而浪費時間"""if not wordDict:return []self.res, self.max_length, self.min_length, self.word_set = [], 0, len(wordDict[0]), set(wordDict)# 后續搜索時沒有必要搜索所有長度,只需要搜索從字典中字符最短長度到最大長度的字符串就行了for word in wordDict:self.max_length = max(self.max_length, len(word))self.min_length = min(self.min_length, len(word))# 動態規劃的列表第一個默認是True,后面默認是False,第一個是True表示空的字符應該認為可以被分割res_list = [not i for i in range(len(s)+1)]# 這里i不是直接的位置,而是位置+1,因為還有一個空的for i in range(1, len(s)+1):for j in range(self.min_length, self.max_length+1):# 小于0了注意別再處理了if i - j < 0:break# 如果某個串在wordDict里,并且這個串開頭是True,就說明到這個位置是可分割的# 還是要注意因為i是加過1的,所以索引容易弄錯if s[i-j:i] in self.word_set and res_list[i-j]:res_list[i] = Truebreak# 只有可分割才進行遞歸分割if res_list[-1]:self.find_and_add(s, [])return self.resdef find_and_add(self, s_in, list_in):for i in range(self.min_length, self.max_length+1):if s_in[:i] in self.word_set:# 一開始返回寫在了下一層里面,然后發現結果會重復,但是如果每次加都判斷速度就會變慢# 所以返回沒有像一般遞歸一樣獨立出來,而是寫在了函數體里面if not s_in[i:]:self.res.append(" ".join(list_in + [s_in[:i]]))returnself.find_and_add(s_in[i:], list_in+[s_in[:i]])總結
以上是生活随笔為你收集整理的leetcode 刷题140 141的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svm的三个核函数
- 下一篇: 导弹飞机突破敌方反导系统防空系统的拦截进