[LeetCode] Word Break II 拆分词句之二

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

[LeetCode] 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”].

这道题是之前那道Word Break 拆分词句的拓展,那道题只让我们判断给定的字符串能否被拆分成字典中的词,而这道题加大了难度,让我们求出所有可以拆分成的情况,就像题目中给的例子所示。可以用DFS的套路来解题,但是不是一般的brute force,我们必须进行剪枝优化,因为按照惯例OJ的最后一个test case都是巨长无比的,很容易就Time Limit Exceeded。那么如何进行剪枝优化呢,可以参见网友水中的鱼的博客,定义一个一位数组possible,其中possible[i] = true表示在[i, n]区间上有解,n为s的长度,如果某个区间之前被判定了无解,下次循环时就会跳过这个区间,从而大大减少了运行时间,参见代码如下:

class Solution {
public:
    vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
        vector<string> res;
        string out;
        vector<bool> possible(s.size() + 1, true);
        wordBreakDFS(s, wordDict, 0, possible, out, res);
        return res;
    }
    void wordBreakDFS(string &s, unordered_set<string> &wordDict, int start, vector<bool> &possible, string &out, vector<string> &res) {
        if (start == s.size()) {
            res.push_back(out.substr(0, out.size() - 1));
            return;
        }
        for (int i = start; i < s.size(); ++i) {
            string word = s.substr(start, i - start + 1);
            if (wordDict.find(word) != wordDict.end() && possible[i + 1]) {
                out.append(word).append(" ");
                int oldSize = res.size();
                wordBreakDFS(s, wordDict, i + 1, possible, out, res);
                if (res.size() == oldSize) possible[i + 1] = false;
                out.resize(out.size() - word.size() - 1);
            }
        }
    }
};
查看评论

C++ Builder 6 进行 SOAP 开发(2) -- 通过 SOAP 传递自定义类型数据

C++ Builder 6 BizSnap/SOAP/WebService(2) -- 通过 SOAP 传递自定义类型数据    本文将做一个略复杂的例子,实现通过 SOAP 传递自定义的数据类型。本...
  • Raptor
  • Raptor
  • 2002-05-02 10:25:00
  • 3946

leetCode: Word Break I & Word Break II

题目: Given a string s and a dictionary of words dict, determine if s can be segmented into a space-s...
  • u011133213
  • u011133213
  • 2014-03-20 20:10:29
  • 5143

LeetCode || Word Break II

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each ...
  • jiadebin890724
  • jiadebin890724
  • 2014-06-26 12:33:38
  • 5649

LeetCode 140. Word Break II(单词切分)

原题网址:https://leetcode.com/problems/word-break-ii/ Given a string s and a dictionary of words dict,...
  • jmspan
  • jmspan
  • 2016-05-27 00:22:25
  • 1301

Word Break II -- LeetCode

原题链接: http://oj.leetcode.com/problems/word-break-ii/  这道题目要求跟Word Break比较类似,不过返回的结果不仅要知道能不能break,...
  • linhuanmars
  • linhuanmars
  • 2014-03-29 00:48:08
  • 19238

LeetCode 140. Word Break II (DP+DFS)

直接递归求解TLE(Time Limit Exceeded), 用vector ret(s.size()+1)保存wordBreak的解MLE(Memory Limit Exceeded), 采用D...
  • u014674776
  • u014674776
  • 2015-02-23 10:39:42
  • 1805

【LeetCode】Word Break II 解题报告

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each ...
  • ljiabin
  • ljiabin
  • 2014-09-02 16:25:40
  • 2754

leetcode 140:Word Break II 采用很巧妙的动态规划和DFS联合使用 JAVA源代码实现

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each ...
  • tingting256
  • tingting256
  • 2015-12-22 19:20:21
  • 664

Leetcode Word Break II

难度是5星级了。 主要的难点: 要优化到极致,不能直接使用递归回溯法,否则超时。 本程序是连打带消地对付了这种情况效率是十分高的了,有12ms运行时间的战果。 比网上很多博客的程序要优化,关键是动...
  • kenden23
  • kenden23
  • 2014-03-04 07:48:07
  • 4744

【LeetCode】Word Break II 动态规划

题目:Word Break 要求找到所有能够有字典中的词重组成目标串的结果  public class Solution { public static List wordBrea...
  • u011955072
  • u011955072
  • 2015-03-28 23:28:04
  • 990
    个人资料
    持之以恒
    等级:
    访问量: 5万+
    积分: 3304
    排名: 1万+
    最新评论