有人可以引导我分析这个问题的时间复杂度吗? 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();
}
}
};
答案 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)
。