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 };
  • 相关阅读:
    STM32 HAL库 UART 串口读写功能笔记
    c语言数组越界的避免方法
    MOS管做开关之初理解
    keil mdk 菜单 “project” 崩溃问题解决
    51 arm x86 的大小端记录
    (C99)复合字面量
    如何的keil试试调试中,看逻辑分析仪Logic viwer
    c语言之——整型的隐式转换与溢出检测
    C语言入坑指南-缓冲区溢出
    C语言入坑指南-被遗忘的初始化
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4565214.html
Copyright © 2011-2022 走看看