zoukankan      html  css  js  c++  java
  • LeetCode Word Break

    class Solution {
    private:
        int* memo;
    public:
        bool wordBreak(string s, unordered_set<string> &dict) {
            memo = new int[s.length() + 1];
    
            for (int i=0; i<=s.length(); i++) memo[i] = -1;
            
            bool ret = dfs(s, 0, dict);
            delete[] memo;
            return ret;
        }
    
        bool dfs(string& s, int pos, unordered_set<string> &dict) {
            if (pos >= s.length()) return true;
            int rest_len = s.length() - pos;
            for (int i = rest_len; i >=1; i--) {
                if (dict.find(s.substr(pos, i)) != dict.end()) {
                    if (memo[pos + i] == -1) {
                        memo[pos + i] = dfs(s, pos + i, dict);
                    }
                    if (memo[pos + i] == 1) return true;
                }
            }
            return false;
        }
    };

    最开始直接用了暴力超时,因为有许多重复计算步骤,可以使用memorize把这些步骤的结果存储起来(更以前用递归算斐波拉契数列一样),常常用这种方式可以解决的问题也可以改写为DP形式,代码如下,快了不少,在5ms左右。

    class Solution {
    public:
        bool wordBreak(string s, unordered_set<string> &dict) {
            bool* dp = new bool[s.length() + 1];
            for (int i=0; i<=s.length(); i++) dp[i] = false;
            dp[0] = true;
            for (int i=1; i<=s.length(); i++) {
                for (int j=i-1; j>=0; j--) {
                    if (dict.find(s.substr(j, i-j)) != dict.end() && dp[j]) {
                        dp[i] = true;
                        break;
                    }
                }
            }
            bool ret = dp[s.length()];
            delete[] dp;
            return ret;
        }
    };

     第二轮:

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

    For example, given
    s = "leetcode",
    dict = ["leet", "code"].

    Return true because "leetcode" can be segmented as "leet code".

    还是只会用memo不能直接写出dp,真挫啊!

    第三轮:

    凭着记忆写吧

     1 class Solution {
     2 public:
     3     bool wordBreak(string s, unordered_set<string>& wordDict) {
     4         int len = s.size();
     5         vector<bool> dp(len + 1, false);
     6         dp[0] = true;
     7         
     8         for (int i=1; i<=len; i++) {
     9             for (int j=i-1; j>=0; j--) {
    10                 if (!dp[j]) continue;
    11                 string p = s.substr(j, i - j);
    12                 if (wordDict.count(p) > 0) {
    13                     dp[i] = true;
    14                     break;
    15                 }
    16             }
    17         }
    18         return dp[len];
    19     }
    20 };
  • 相关阅读:
    图论模板 求割顶/判断二分图
    扩展KMP模板
    validation框架校验详细步骤
    actionForward的多种跳转方法
    struts彻底解决中文乱码问题的过滤器
    struts复习笔记1
    No configuration found. Configuring ehcache from ehcachefailsafe.xml 警告的解决方案
    数据库中数据添加到下拉列表的实现方法
    LookupDispatchAction的详细使用步骤
    表单校验功能的完整实现步骤
  • 原文地址:https://www.cnblogs.com/lailailai/p/3711776.html
Copyright © 2011-2022 走看看