我正在研究一个问题给定一个字符串s,分区s使得分区的每个子字符串都是回文。
返回s的回文分割所需的最小切割。这个问题也可以在这里找到。https://oj.leetcode.com/problems/palindrome-partitioning-ii/
版本1是我在网上找到的解决方案的一个版本。
版本2是我的代码。
它们似乎以非常相似的方式工作。然而,对于相当大的输入,版本2需要超过6000毫秒,而版本1大约需要71毫秒。
谁能提供任何想法的时差是从哪里来的?
版本1:int minSol(string s) {
int len = s.size();
vector<int> D(len + 1);
vector<vector<int>> P;
for (int i = 0; i < len; i++){
vector<int> t(len);
P.push_back(t);
}
for (int i = 0; i <= len; i++)
D[i] = len - i;
for (int i = 0; i < len; i++)
for (int j = 0; j < len; j++)
P[i][j] = false;
for (int i = len - 1; i >= 0; i--){
for (int j = i; j < len; j++){
if (s[i] == s[j] && (j - i < 2 || P[i + 1][j - 1])){
P[i][j] = true;
D[i] = min(D[i], D[j + 1] + 1);
}
}
}
return D[0] - 1;
}
版本2:int minCut(string s) {
int size = s.size();
vector<vector<bool>> map;
for (int i = 0; i < size; i++){
vector<bool> t;
for (int j = 0; j < size; j++){
t.push_back(false);
}
map.push_back(t);
}
vector<int> minCuts;
for (int i = 0; i < size; i++){
map[i][i] = true;
minCuts.push_back(size - i - 1);
}
for (int i = size - 1; i >= 0; i--){
for (int j = size - 1; j >= i; j--){
if (s[i] == s[j] && (j - i <= 1 || map[i + 1][j - 1])){
map[i][j] = true;
if (j == size - 1){
minCuts[i] = 0;
}else if (minCuts[i] > minCuts[j + 1] + 1){
minCuts[i] = minCuts[j + 1] + 1;
}
}
}
}
return minCuts[0];
}
我猜这是因为在第二个版本中你做的是size
^2 push_back
's,而在第一个版本中你只做size
push_back
's。