Hard-题目45:140. Word Break II

题目原文:
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
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和单词数组dict,求出所有s在字典dict下分词的结果。
题目分析:
看起来还是好麻烦,找了一个比较笨但是好理解一些的办法:
令dp[i]表示s[0…i-1]子串的所有分词下的最后一个单词的所有情况,因此dp开成List数组。
如对于上面的例子: s.length()=10, 则 dp[10] = {“cat”}, dp[7]={“and”,”sand”}, dp[4]={“cats”}, dp[3]={“cat”}, dp[0]={}, 其它的都为null。
首先从前往后扫一遍字符串,如果扫到i时,发现[0,i]分是可分词的(即dp[i]!=null)且i下标后面又恰好跟了一个单词word,结尾是end,则把word加入dp[end]中。
构造完dp数组后,从后向前深度优先遍历字符串,一直记录分词的路径,如果找到dp[0]则加入答案,否则回退继续找。
源码:(language:java)

public class Solution {
  public static List<String> wordBreak(String s, Set<String> dict) {
    List<String> dp[] = new ArrayList[s.length()+1];
    dp[0] = new ArrayList<String>();
    for(int i=0; i<s.length(); i++){
      //i是开始位置
      if( dp[i] == null ) continue; //前面的部分必须是可以匹配的
      for(String word:dict){
        int len = word.length();
        int end = i+len;
        if(end > s.length()) continue;
        if(s.substring(i,end).equals(word)){
          if(dp[end] == null){
            dp[end] = new ArrayList<String>();
          }
          dp[end].add(word);//记录上一个位置
        }
      }
    }

    List<String> ans = new LinkedList<String>();
    if(dp[s.length()] == null) return ans; 
    ArrayList<String> tmp = new ArrayList<String>();
    dfs(dp,s.length(),ans, tmp);
    return ans;
  }

  public static void dfs(List<String> dp[],int end,List<String> res, ArrayList<String> tmp){
    if(end <= 0){
      String ans = tmp.get(tmp.size()-1);
      for(int i=tmp.size()-2; i>=0; i--)
        ans += (" " + tmp.get(i) );
      res.add(ans);
      return;
    }
    for(String str:dp[end]){
      tmp.add(str);
      dfs(dp,end-str.length(), res, tmp);
      tmp.remove(tmp.size()-1);
    }
  }
}

成绩:
28ms,7.71%,16ms,12.53%
Cmershen的碎碎念:
NLP中的分词多是基于前向最大匹配算法、后向最大匹配算法等,比本题的暴力解法增加了概率模型。

阅读更多
个人分类: Leetcode
上一篇Hard-题目44:30. Substring with Concatenation of All Words
下一篇Hard-题目46:214. Shortest Palindrome
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭