10

In order to find the minimal number of insertions required to convert a given string(s) to palindrome I find the longest common subsequence of the string(lcs_string) and its reverse. Therefore the number of insertions to be made is length(s) - length(lcs_string)

What method should be employed to find the equivalent palindrome string on knowing the number of insertions to be made?

For example :

1) azbzczdzez

Number of insertions required : 5 Palindrome string : azbzcezdzeczbza

Although multiple palindrome strings may exist for the same string but I want to find only one palindrome?

4

5 回答 5

13

Let表示从 index 开始并在 index 结束S[i, j]的字符串的子字符串(包括两者),并且是 的最优解。Sijc[i, j]S[i, j]

显然,c[i, j] = 0 if i >= j

一般来说,我们有递归:

在此处输入图像描述

于 2012-05-24T07:18:54.503 回答
1

为了详细说明 VenomFangs 的答案,有一个简单的动态编程解决方案。请注意,我假设此处允许的唯一操作是插入字符(不删除、更新)。令 S 为 n 个字符的字符串。对此的简单递归函数 P 是:

    = P [i+1 .. j-1], if S[i] = S[j] 

P[i..j]

    = min (P[i..j-1], P[i+1..j]) + 1,

如果您想进一步解释为什么这是真的,请发表评论,我很乐意解释(尽管稍加思考就很容易看到)。顺便说一句,这与您使用的 LCS 功能完全相反,因此验证您的解决方案实际上是最优的。当然这完全有可能是我搞砸了,如果是这样,请有人告诉我!

编辑:考虑回文本身,这可以很容易地完成如下: 如上所述, P[1..n] 会给你使这个字符串成为回文所需的插入次数。建立上述二维数组后,您可以通过以下方式找到回文:

从 i=1,j=n 开始。现在,字符串输出 = "";

while(i < j)
{
    if (P[i][j] == P[i+1][j-1]) //this happens if no insertions were made at this point
    {
        output = output + S[i];
        i++;
        j--;
    }
    else
    if (P[i][j] == P[i+1][j]) //
    {
        output = output + S[i];
        i++;
    }
    else
    {
        output = S[j] + output;
        j--;
    }
 }
 cout<<output<<reverse(output);
 //You may have to be careful about odd sized palindromes here,
 // I haven't accounted for that, it just needs one simple check

这样会更好阅读吗?

于 2012-05-24T03:37:54.063 回答
0

该解决方案看起来是一个动态编程解决方案。

您可能可以在以下帖子中找到答案:如何计算将字符串转换为回文所需的字符数?

于 2012-05-24T00:57:08.443 回答
-1

O(n) 的 PHP 解决方案

function insertNode(&$arr, $idx, $val) {
    $arr = array_merge(array_slice($arr, 0, $idx), array($val), array_slice($arr, $idx));
}
function createPalindrome($arr, $s, $e) {
    $i = 0;
    while(true) {
        if($s >= $e) {
            break;
        } else if($arr[$s] == $arr[$e]) {
            $s++; $e--; // shrink the queue from both sides 
            continue;
        } else {
            insertNode($arr, $s, $arr[$e]);
            $s++;
        }
    }
    echo implode("", $arr);
}
$arr = array('b', 'e', 'a', 'a', 'c', 'd', 'a', 'r', 'e');
echo createPalindrome ( $arr, 0, count ( $arr ) - 1 );
于 2016-10-18T09:10:09.147 回答
-2

简单的。见下文 :)

        String pattern = "abcdefghgf";
        boolean isPalindrome = false;
        int i=0,j=pattern.length()-1;
        int mismatchCounter = 0;

        while(i<=j)
        {
            //reverse matching
            if(pattern.charAt(i)== pattern.charAt(j))
                {
                    i++; j--; 
                    isPalindrome = true;
                    continue;
                }

            else if(pattern.charAt(i)!= pattern.charAt(j))
                {
                    i++;
                    mismatchCounter++;
                }


        }
        System.out.println("The pattern string is :"+pattern);
        System.out.println("Minimum number of characters required to make this string a palidnrome : "+mismatchCounter);
于 2016-06-16T15:54:53.550 回答