已知:
給一字串s和單詞的字典dict,在字串中增加空格來構建乙個句子,並且所有單詞都來自字典。
返回所有有可能的句子。
示例:
給一字串lintcode,字典為["de", "ding", "co", "code", "lint"]
則結果為["lint code", "lint co de"]。
思路:
用動態規劃的思路,這道題目按照遞迴是很容易解決的。
首先,我們找到字典dict中所有可以作為字串s的開頭的string;
然後,結果返回為 string + 函式(餘下的s部分,字典dict)
因為返回是乙個list集合,所以list中所有資料都要和string連線一次(我在相應**會特別注釋)
當然,實際考慮到一些特殊情況,執行效率可能還能夠有所提公升,但是基礎的**部分是相當簡單的。
**如下:
public class solution
/*//特殊情況1:s中乙個元素是dict中不存在的,返回必為空
//"aaaaaabaaaaaaaaaaaaa"
//["a","aa","aaa","aaaa","aaaaa","aaaaaa"]
setset1 = calculate(s);
setset2 = calculate(tostring(worddict));
if (!set2.containsall(set1))
//這裡的**比較無奈,因為注釋以外的**時間複雜度不高,執行很快,但是通不過,也就是下面這種特殊情況時間複雜度過高
//特殊情況2:
//"aaaaaaaabaaaaaaaaaa"
//["a","b","aa","aaa","aaaa","aaaaa","aaaaaa"]
int count = 0;
string unique = null;
for (string temp : worddict)
}if (count == 1 && unique(unique, worddict))
}return ret;}*/
for (string temp : worddict)
if (s.startswith(temp)) }}
return ret;
}private static boolean unique(string unique, set
worddict)
}return count == 1;
}private static string tostring(set
worddict)
return ret.tostring();
}private static set
calculate(string s)
return ret;
}}
以上注釋外的**是初始**,其實即使是最後乙個案例,通過時間也是很短的,總共128*512中情況,但是檢測系統不給通過,無奈之下有了注釋內的**,將s分成左右兩段分別獲得list(但是**通用性還是不高,只是用來應付一下,真正的高通用性應該是dict中的某資料是dict中唯一含有特定字元的資料,且這個資料出現在了s中,但是這其實已經是特殊情況了,放在正常情況下反而增加了很多額外工作量,因此就沒深入去寫了)
以上,謝謝您的閱讀,希望對您有所幫助ヽ( ̄▽ ̄)ノ
單詞拆分 II
單詞拆分 ii 給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,在字串中增加空格來構建乙個句子,使得句子中所有的單詞都在詞典中。返回所有這些可能的句子。說明 分隔時可以重複使用字典中的單詞。你可以假設字典中沒有重複的單詞。示例 1 輸入 s catsanddog worddic...
140 單詞拆分 II
給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,在字串中增加空格來構建乙個句子,使得句子中所有的單詞都在詞典中。返回所有這些可能的句子。說明 分隔時可以重複使用字典中的單詞。你可以假設字典中沒有重複的單詞。示例 1 輸入 s catsanddog worddict cat ca...
leetcode 單詞拆分II
這道題一眼看去,就死類似於單詞拆分i的深度優先搜尋就可以解決的題目,不過這裡公升級了,就是要把每一種切分結果都要返回。具體 如下 class solution def wordbreak self,s str,worddict list str list str mem tmp self.dfs s...