日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 刷题140 141

發布時間:2024/10/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。