【发布时间】:2020-10-17 13:01:43
【问题描述】:
例如,字符串 "abab" 需要一个拆分成两个字符串:"ab" 和 "ab" 所以答案是1 和字符串 "ababab" 不需要任何拆分,所以答案是 0。
我想出了一个解决方案,它检查每个子字符串的条件并将结果存储在一个布尔矩阵中,然后填充一个 int 矩阵,以便找到最小的分割数。关于如何使算法更快的任何想法?
bool condition(const int count[]) {
for (int i = 0; i <= 25; i++){
if (count[i] != 0 && count[i] % 2 == 0) {
return false;
}
}
return true;
}
int minPartion(std::string& str)
{
int n = str.size();
int i, j, k, L;
int** even = new int*[n];
for(int i = 0; i < n; ++i)
even[i] = new int[n];
int** minSplits = new int*[n];
for(int i = 0; i < n; ++i)
minSplits[i] = new int[n];
for (i = 0; i < n; i++)
{
even[i][i] = true;
minSplits[i][i] = 0;
}
for (int i = 0; i < n; i++) {
int count2[26] = {0};
for (int j = i; j < n; j++) {
count2[str[j] - 'a']++;
even[i][j] = condition(count2);
}
}
for (L = 2; L <= n; L++)
{
for (i = 0; i < n - L + 1; i++)
{
j = i + L - 1;
if (even[i][j])
minSplits[i][j] = 0;
else
{
minSplits[i][j] = INT_MAX;
for (k = i; k <= j - 1; k++)
minSplits[i][j] = min(minSplits[i][j], minSplits[i][k] + minSplits[k + 1][j] + 1);
}
}
}
return minSplits[0][n - 1];
}
【问题讨论】:
-
你的意思是奇数次,对吧?
-
是的,我就是这个意思。
标签: string algorithm matrix dynamic split