【问题标题】:Create palindrome from existing string by removing characters通过删除字符从现有字符串创建回文
【发布时间】:2012-05-21 14:07:40
【问题描述】:

如何通过删除零个或多个字母来确定您可以从单词中获得的最长回文长度。

例如:amanQQQapl12345anacaZZZnalpaXXXna67890ma
最长的回文将是 21 位数。

【问题讨论】:

  • 我还没有尝试任何东西..需要一些逻辑帮助..
  • 请将其标记为算法。你会得到更快的答案。
  • 请注意,如果您四处搜索,您会发现最长回文子序列和最长回文子字符串的算法。您的问题是子序列版本。

标签: java string algorithm palindrome


【解决方案1】:

这是@Rambo 答案的正确实现,以防其他人发现他的答案过于简洁。我添加了对先前结果的缓存,但条件是不同符号的最大数量最多为 1000。由于多个分支使用相同的子分支,这提供了显着的加速。

int d[1000][1000] = {0}; // To store result of previous computation

int computeMaxPalindromeLength(vector<int>& a, int start, int end) {
    if(d[start][end] != 0) // If not precomputed, recompute.
        return d[start][end];
    if(start == end) { // The mid character should be taken as 
        d[start][end] = 1;
        return 1;
    }
    else if(start == end-1) {
        d[start][end] = (a[start] == a[end])?2:1;
        return d[start][end];
    }
    if(a[start] == a[end]) {
        d[start][end] = max( 2 + computeMaxPalindromeLength(a, start+1, end-1), 
            max(computeMaxPalindromeLength(a, start+1, end), computeMaxPalindromeLength(a, start, end-1)));
    } else {
        d[start][end] = max(computeMaxPalindromeLength(a, start+1, end), computeMaxPalindromeLength(a, start, end-1));
    }
    return d[start][end];
}

将上述方法调用为:-

vector<int>& a; // Convert each character of string to digit if working with alphanumeric characters.
int maxPalindromeLength = computeMaxPalindromeLength(a, 0, a.size()-1);

【讨论】:

    【解决方案2】:

    单词W中最长的回文是W及其镜像的longest common subsequence

    您可以在 O(n²) 时间和 O(n) 空间中计算它,其中 n 是 W 的长度,但如果您知道只需删除几个字符即可生成回文,则可以有更好的复杂性。

    【讨论】:

    • 这似乎不是真的。考虑“abcdecba”。
    • “abcdecba”和“abcedcba”的最长公共子序列是“abcdcba”(或长度相同的“abcecba”)我看不出你的问题。
    【解决方案3】:

    回文最多可以有一个奇数字母,即中间字母,以及任意数量的偶​​数字母。

    您可以计算每个字母出现的频率。如果每个字母不是全有或全无,则为每个字母添加 count/2*2,如果任何字母的计数为奇数,则添加一个。

    【讨论】:

      【解决方案4】:

      这可以通过动态规划来解决。定义 d[i, j] 为原始字符串中最长回文的长度。

      如果 s[i] = s[j], d[i, j] = max(d[i+1, j-1] + 2, d[i, j-1], d[i+1 , j])。

      否则 d[i, j] = max(d[i, j-1], d[i+1, j])。

      【讨论】:

      • 正确,但请正确格式化并解释其工作原理。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 2014-08-07
      • 2011-06-21
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多