【发布时间】:2016-11-16 19:51:58
【问题描述】:
关于how to convert a string to palindrome with minimum number of removals of characters of the string?的问题。我编写程序来测试接受的答案。但是递归需要太多时间。如何解决或改进这个问题?以下是接受的答案:
令 dp[i, j] = 将子串 [i, j] 转换为回文所需的最小删除次数。我们有:
dp[i, i] = 0 for all i (every single character is a palindrome)到 找到 dp[i, j],让我们考虑一个随机字符串。我们有两个 可能性:
第一个和最后一个字符相等:a[i] == a[j]。在这种情况下, 我们可以将问题简化为找到最小字符数 需要删除以使子字符串 [i+1, j-1] a 回文。
第一个和最后一个字符不相等:a[i] != a[j]。 在这种情况下,我们需要删除其中一个。我们将删除 引导我们找到更好的解决方案。
/* remvoe the least characters to make a string be palindrome */
#include <stdio.h>
#include <string.h>
#define MAXLINE 4096
int func(char *p, int low, int high);
int min(int m, int n); // get the minimal value
int main(void)
{
char str[MAXLINE];
int ret;
while (scanf("%s", str) != EOF) { // input in a loop
ret = func(str, 0, strlen(str) - 1); // call func
printf("%d\n", ret);
}
return 0;
}
/* find the minimal number of characters in a string,
* which are needed removed to make the string be palindrome
*/
int func(char *p, int low, int high)
{
int n;
int l;
int r;
if (low >= high) {
return 0;
}
if (p[low] == p[high]) { // needn't remove
n = func(p, low + 1, high - 1);
}
else {
l = func(p, low + 1, high);
r = func(p, low, high - 1);
n = min(l, r) + 1;
}
return n;
}
/* return the minimal variable */
int min(int m, int n)
{
return (m < n ? m : n);
}
【问题讨论】:
-
请定义“太多时间”。此外,如果您的代码正在运行并且您希望获得有关如何改进它的建议,那么Code Review 可能是您提出问题的更合适的地方。
-
找到的代码足够快地处理短文本。在
l = func(p, low + 1, high);之后添加if (l== 0) return 1;加快速度 -
@kaylum 我随机试了字符串“jfdasflkjdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj”,但是很久没有反应。
-
@chux 我已经添加了我的测试。
-
你应该以某种方式记住递归调用。这会将您的指数时间解决方案变成 O(n^2) 时间解决方案。