給定乙個字串和乙個字典,在字串中新增空格來構造乙個句子,使句子中的每個單詞在字典中都存在;
輸入 :字串
輸出:所有可能的句子
例如:
s=」catsanddog」
dict=[「cat」,」cats」,」and』,」sand」,」dog」]
輸出:cats and dog和cat sand dog
將字串分割成2部分s1和s2,如果s1包含在字典中,則遞迴計算s2;然後合併s1和s2分割的結果;
s2可能無法分割,則返回乙個」「;
動態規劃方法:
狀態轉移方程:
* f(i) 表示s[0,i]是否可以分詞
* f(i) = f(j) && f(j+1,i); 0 <= j < i;
words dict,
* determine if s can be segmented into a space-separated sequence of
* one or more dictonary words.
* * sucha as:
* s=leetcode
* dict=[leet,code]
* return
true
*/public static boolean wordbreak(string s, setdict)
boolean dp=new boolean[s.length()+1];
dp[0]=true;
for(int i=0;i<=s.length();i++)
}
}return dp[s.length()];
}
private static arraylistwordbreak_2(string s,setdict)
for(int i=1;i<=s.length();i++)else}}
}return list;
}
上述遞迴實現===超時
加入map,記錄字串對應的結果
private static arraylistwordbreak_2(string s,setdict,hashmap> map)
arraylistlist=new arraylist();
if(s.length()==0)
for(int i=1;i<=s.length();i++)else}}
}map.put(s, list);
return list;
}
動態規劃問題系列 Disk Schedule
有很多從磁碟讀取資料的需求,包括順序讀取 隨機讀取。為了提高效率,需要人為安排磁碟讀取。然而,在現實中,這種做法很複雜。我們考慮乙個相對簡單的場景。磁碟有許多軌道,每個軌道有許多扇區,用於儲存資料。當我們想在特定扇區來讀取資料時,磁頭需要跳轉到特定的軌道 具體扇區進行讀取操作。為了簡單,我們假設磁頭...
動態規劃系列
有n件物品和乙個容量為 v的揹包,放入第i件物品的空間消耗是ci 得到的價值是wi 求解將哪些物品裝入揹包可使價值總和最大。基本思路 定義子問題 f i j 表示將前i個物品放入容量為j的揹包中。求解時只需考慮第i個物品放入或者不放入兩種可能 則有狀態轉移方程 f i j max else dp i...
整數劃分系列問題(動態規劃)
今天上演算法分析與設計課時,提到整數劃分問題,但是因為之前沒有很好地理解這一系列的問題。當被老師問到你們做演算法的應該會這個問題吧,我當時也不太記得,但是只能硬頭皮試著去寫了下,用的是brute force,老師果斷說我的方法跑不出正確的解,但是課堂上我也沒有去解釋了。課後自己驗證了一下,沒有問題,...