zoukankan      html  css  js  c++  java
  • [LeetCode] Word Break II

    Well, it seems that many people meet the TLE problem. Well, I use a simple trick in my code to aoivd TLE. That is, each time before I try to break s, I call isBreakable (just wordBreak from Word Break) to see whether it is breakable. If it is not breakable, then we need not move on. Otherwise, we break it using backtracking.

    The idea of backtracking is also typical. Start from index 0 of s, each time we see a word that is in wordDict, add it to a temporary string sentence. When we reach the end of the s, add sentence to sentences. Then we need to recover sentence back to its original status before word was added. So I simply record a temporary string temp each time before I add word to sentence and use it to recover the status.

    The code is as follows. I hope it to be self-explanatory enough.

     1 class Solution {
     2 public:
     3     bool isWordBreak(string& s, unordered_set<string>& wordDict) {
     4         vector<bool> dp(s.length() + 1, false);
     5         dp[0] = true;
     6         int minlen = INT_MAX;
     7         int maxlen = INT_MIN;
     8         for (string word : wordDict) {
     9             minlen = min(minlen, (int)word.length());
    10             maxlen = max(maxlen, (int)word.length());
    11         }
    12         for (int i = 1; i <= s.length(); i++) {
    13             for (int j = i - minlen; j >= max(0, i - maxlen); j--) {
    14                 if (dp[j] && wordDict.find(s.substr(j, i - j)) != wordDict.end()) {
    15                     dp[i] = true;
    16                     break;
    17                 }
    18             }
    19         }
    20         return dp[s.length()];
    21     }
    22     void breakWords(string s, int idx, unordered_set<string>& wordDict, string& sol, vector<string>& res) {
    23         if (idx == s.length()) {
    24             sol.resize(sol.length() - 1);
    25             res.push_back(sol);
    26             return;
    27         }
    28         for (int i = idx; i < s.length(); i++) {
    29             string word = s.substr(idx, i - idx + 1);
    30             if (wordDict.find(word) != wordDict.end()) {
    31                 string tmp = sol;
    32                 sol += word + " ";
    33                 breakWords(s, i + 1, wordDict, sol, res);
    34                 sol = tmp;
    35             }
    36         }
    37     }
    38     vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
    39         string sol;
    40         vector<string> res;
    41         if (!isWordBreak(s, wordDict)) return res;
    42         breakWords(s, 0, wordDict, sol, res);
    43         return res;
    44     }
    45 };
  • 相关阅读:
    服务器性能测试实时监控Linux命令
    软件性能测试中的关键指标
    递归静态路由和直连静态路由
    FIB表与RIB表的区别与联系
    FIB表中 Next Hop 的几种状态码(drop/receive/attached/no route)的含义
    Leetcode 与树(TreeNode )相关的题解测试工具函数总结
    centos 7.6 docker 安装 nextcloud -使用sqlite数据库
    看守所收押流程
    qt编译oracle驱动,qt 5.12 连接 oracle 数据库示例代码
    centos 7.6 安装配置nginx (显示中文目录,带密码验证)
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4565214.html
Copyright © 2011-2022 走看看