LeetCode每日一题:分词2

问题描述

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"].

问题分析

这题和word break i很相似的,但是一般的动态规划我们仅仅保存结果,这题要判断是否可以分词,而且也要输出所有的分词结果

  • 所以从第一题来说,要用dp[i]表示成ArrayList来存储分词结果
  • 本题中dp[i]=dp[i-j]+s[j,i]的分词方法
  • 最后用DFS(深度优先搜索遍历一遍输出结果)

代码实现

public ArrayList wordBreak(String s, Set dict) {
        ArrayList[] dp = new ArrayList[s.length() + 1];
        dp[0] = new ArrayList();
        for (int i = 0; i < s.length(); 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();
                    }
                    dp[end].add(word);
                }
            }
        }
        ArrayList ans = new ArrayList();
        if (dp[s.length()] == null) return ans;
        ArrayList tmp = new ArrayList();
        dfsSearch(dp, s.length(), ans, tmp);
        return ans;
    }

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

你可能感兴趣的:(LeetCode每日一题:分词2)