这个LC问题的时间复杂度是多少

时间:2020-03-17 12:14:14

标签: time-complexity

有人可以引导我分析这个问题的时间复杂度吗? https://leetcode.com/problems/palindrome-partitioning/

我有一个使用DFS +回溯+ DP的解决方案,如下所示,我认为从时间复杂度上讲,它可以归结为麦芽汁情况下可以使用的分区数量,但一直在努力弄清楚它是什么。

class Solution {
public:
    vector<string> cur;
    vector<vector<string>> ans;
    vector<vector<bool>> isPalindrome;
    unordered_map<int,vector<int>> pairs;

    vector<vector<string>> partition(string s) {
        isPalindrome.resize(s.length(),vector<bool>(s.length(),false));
        buildPalindromePairs(s);
        backtracking(s,0);
        return ans;
    }

    void buildPalindromePairs(string s)
    {
        for(int i=0;i<s.length();++i)
        {
            for(int j=i;j>=0;j--)
            {
                if(i==j) 
                    isPalindrome[j][i]=true;
                else if(j==i-1 && s[j]==s[i]) 
                    isPalindrome[j][i]=true;
                else if(s[j]==s[i] && isPalindrome[j+1][i-1])
                    isPalindrome[j][i]=true;

                if(isPalindrome[j][i])
                    pairs[j].push_back(i);
            }
        }
    }

    void backtracking(string s, int start)
    {
        if(start==s.length()) 
        {
            ans.push_back(cur);
            return;
        }

        for(auto end:pairs[start])
        {
            cur.push_back(s.substr(start, end-start+1));
            backtracking(s,end+1);
            cur.pop_back();
        }
    }
};

1 个答案:

答案 0 :(得分:0)

方法isPalindrome()可以在O(n)中解决。

在嵌套的for循环中,方法buildPalindromePairs(string s)O(n^2)

方法void backtracking(string s, int start)O(2^(n - 1)),因为您可以选择或不选择每个字符。因此,每个角色都有2个选项。因此n个字符可以理想地显示2^n(2^(n-1))选项,因为理想情况下必须有一个字符。

总体复杂度为O(2^n)