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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

140. Word Break II

發(fā)布時(shí)間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 140. Word Break II 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 1 題目理解
  • 2 回溯+記憶化

1 題目理解

140與130的區(qū)別是,當(dāng)字符串可分的時(shí)候,要求返回具體的分割字符串。

2 回溯+記憶化

對(duì)于字符串s,如果前面一部分是單詞列表中的詞,則拆分出這個(gè)單詞,右邊的繼續(xù)分割。
分割過程中,對(duì)起始下標(biāo)i,已經(jīng)分割過的,用map緩存。
使用字典樹也可以加快搜索速度。

class Solution {private Trie trie;private List<String> result;public List<String> wordBreak(String s, List<String> wordDict) {int n = s.length();trie = new Trie();trie.initWord(wordDict);result = new ArrayList<String>();dfs(s,0);return cache.get(0);}private Map<Integer,List<String>> cache = new HashMap<Integer,List<String>>();private void dfs(String s, int i){if(i>=s.length()){return;}if(cache.get(i)!=null) return;List<String> r = new ArrayList<String>();for(int x = i+1;x<=s.length();x++){String left = s.substring(i,x);if(trie.find(left)){dfs(s,x);if(cache.get(x)!=null){for(String right : cache.get(x)){r.add(left+" "+right);}}else{r.add(left);}}}cache.put(i,r);} } class Trie{private TrieNode root = new TrieNode('/');public void initWord(List<String> wordDict){for (String word : wordDict){addWord(word);}}public boolean find(String word){TrieNode node = root;for(int i=0;i<word.length();i++){int index = word.charAt(i) - 'a';if(node.children[index]==null){return false;}node = node.children[index];}return node.end;}private void addWord(String word) {TrieNode node = root;for(int i=0;i<word.length();i++){int index = word.charAt(i) - 'a';if(node.children[index]==null){node.children[index] = new TrieNode(word.charAt(i));}node = node.children[index];}node.end = true;}class TrieNode{TrieNode[] children = new TrieNode[26];boolean end;private char data;public TrieNode(char data){this.data = data;}} }

補(bǔ)充:也可以在139的基礎(chǔ)上做。在找到0到i可以分割的時(shí)候,記錄下分割方式。當(dāng)然這種方法也可以加上Trie樹。

class Solution {public List<String> wordBreak(String s, List<String> wordDict) {Map<Integer,List<String>> resultMap = new HashMap<Integer,List<String>>();int n = s.length();boolean[] dp = new boolean[n+1];//從0到i可以被分解dp[0] = true;for(int i=1;i<=n;i++){resultMap.put(i, new ArrayList<String>());for(int j=0;j<i;j++){if(dp[j]==true && wordDict.contains(s.substring(j,i))){dp[i]=true;if(j==0){resultMap.get(i).add(s.substring(j,i));}else{for(String pre:resultMap.get(j)){resultMap.get(i).add(pre+" "+s.substring(j,i));}} }}}return resultMap.get(n);} }

總結(jié)

以上是生活随笔為你收集整理的140. Word Break II的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。