我正在寻找一种分而治之的算法来解决用最少的字母重新定位来制作单词回文的问题。
此算法适用于peept
这样的字词,可以转换为petep
,在t
和p
之间进行两次重定位(给出peetp
)然后t
和e
(给petep
)。
是否可以通过分而治之来做到这一点?
这不是我的功课。知道很有趣。
这是我在C#中编写的算法,但这是最少替换的最佳方法吗?
private string MakePalindrome(StringBuilder word, int i, int j)
{
if (i == j)
{
return word[i].ToString();
}
if (i + 1 == j && word.Length%2 == 0)
{
return word[i] == word[j] ? word.ToString() : "infinite";
}
if (word[i] != word[j])
{
for (int k = j; k >= i; k--)
{
if (k == i)
return "infinite";
if (word[k] == word[i])
{
char ch = word[j];
word[j] = word[k];
word[k] = ch;
replaceCounter++;
break;
}
}
}
var palindrome = MakePalindrome(new StringBuilder(word.ToString(i+1, j-i-1)),i,j-2);
if (palindrome == "infinite")
return "infinite";
return word[i] + palindrome + word[j];
}