关闭

Hard-题目45:140. Word Break II

94人阅读 评论(0) 收藏 举报
分类:

题目原文:
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中的分词多是基于前向最大匹配算法、后向最大匹配算法等,比本题的暴力解法增加了概率模型。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:55917次
    • 积分:3198
    • 等级:
    • 排名:第10679名
    • 原创:270篇
    • 转载:53篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论