Return all such possible sentences.
For example, given
s ="catsanddog",
dict =["cat", "cats", "and", "sand", "dog"].
A solution is["cats and dog", "cat sand dog"].
/*
s ="catsanddog",
dict =["cat", "cats", "and", "sand", "dog"].
动态规划根本思想是记录状态值:
DP[i][j]:
j 0 1 2 3 4 5 6 7 8 9
i
0 c ca cat(1) cats(1) catsa catsan catsand catsandd catsanddo catsanddog
1 a at ats atsa atsan atsand atsandd atsanddo atsanddog
2 t ts tsa tsan tsand tsandd tsanddo tsanddog
3 s sa san sand(1) sandd sanddo sanddog
4 a an and(1) andd anddo anddog
5 n nd ndd nddo nddog
6 d dd ddo ddog
7 d do dog(1)
8 o og
9 g
*/
public class WordBreak2
{
private static List<String> _list = new ArrayList<String>();
private static List<String> _temp = new ArrayList<String>();
private static int[][] _dp = null;
public static List<String> wordBreak(String s, Set<String> dict)
{
if(null == s || s.trim().equals("") || null == dict || dict.isEmpty())
{
return _list;
}
_dp = new int[s.length()][s.length()];
//记录状态
for(int i = 0; i < s.length(); ++i)
{
for(int j = i; j < s.length(); ++j)
{
if(dict.contains(s.substring(i, j + 1)))
{
_dp[i][j] = 1;
}
}
}
output(s.length() - 1, s, _dp);
List<String> _result = new ArrayList<String>();
for(int i = _list.size() - 1; i >= 0; --i)
{
_result.add(_list.get(i));
}
return _result;
}
//length为字符串s的下标
private static void output(int length, String s, int[][] dp)
{
if(length < -1 || null == s || s.trim().equals("") || null == dp)
{
return;
}
//递归结束条件
if(length == -1)
{
StringBuilder _sb = new StringBuilder();
for(int i = _temp.size() - 1; i >= 0; --i)
{
_sb.append(_temp.get(i));
if(i != 0)
{
_sb.append(" ");
}
}
_list.add(_sb.toString());
}
for(int i = 0; i <= length; ++i)
{
if(dp[i][length] == 1)
{
_temp.add(s.substring(i, length + 1));
output(i - 1, s, dp);
_temp.remove(_temp.size() - 1);
}
}
}
}