确定代码的运行时间

时间:2015-09-30 07:51:18

标签: c++ dynamic-programming asymptotic-complexity

我今天写了下面的dp代码,它工作正常,因为它提交了一些要点(here is the problem)。但是我无法确定代码的运行时间。我觉得它是O(n^2 * log D),但我无法证明这一点。

class Solution {
public:
    unordered_map<string, bool> m;
    bool wordBreak(string s, unordered_set<string>& wordDict) {
        int n = s.length();
        string t = "";
        for(int i=0;i<n;i++){
            t += s.at(i);
            //cout << t << endl;
            if(wordDict.find(t) != wordDict.end()){
                m[t] = true;
                string x = "";
                for(int j=i+1;j<n;j++){
                    x += s.at(j);
                }
                if(x == ""){
                    return true;
                }
                if(m.find(x) != m.end()){
                    if(m[x] == true){
                        return true;
                    }else{
                        continue;
                    }
                }else{
                    if(wordBreak(x, wordDict)){
                        m[x] = true;
                        return true;
                    }else{
                        //cout << x << endl;
                        m[x] = false;
                        continue;
                    }
                }
            }else{
                //m[t] = false;
            }
        }
        return false;
    }
};

3 个答案:

答案 0 :(得分:1)

首先,我要改写如下(未经测试):

class Solution {
public:
    unordered_map<string, bool> m;
    bool wordBreak(string s, unordered_set<string>& wordDict) 
    {
        while (!s.empty())
        {
        int n = s.size() ;
        for(int i=0;i<n;i++){
            //cout << t << endl;
            if(wordDict.find(s.substr(0, i)) != wordDict.end()){
                m[t] = true;
                s = s.substr(i) ;
                break ;
        }
        return !m.empty();
    }
};

基本思路是,一旦找到匹配项,就可以从字符串中删除匹配的部分。然后我会说它是n * logD。毕竟你在for循环中只进行了一次传递。假设你在m&lt;然后你得到一个新的循环(n-m)。

答案 1 :(得分:1)

似乎有O(n*n)复杂性。你使用记忆,你的算法的每一步都在m中产生至少1个新值。任何字符串中都有n*n/2个子字符串,因此在最坏的情况下,您将找到整个字符串的解决方案,其中包含n * n / 2个段落。

PS:认为unordered_map适用于O(1)

编辑:

在您的情况下,考虑unordered_map与O(n)一起使用可能更合适。 m.find需要为它的参数计算哈希值,它是字符串。如果您存储索引而不是字符串本身,它可能会更快地工作。

答案 2 :(得分:1)

以下是我如何解决它。

window.top.close();