所以我有這個字符串"nmmaddammhelloollehdertr"
,如果我們將字符串拆分爲x = "nmmaddamm"
和y = "helloollehdertr"
我們可以找到LPS爲x = "mmaddamm"
和y = "helloolleh"
。我們知道,這是最大的迴文作爲x
有8
的長度,y
有10
的長度。 10 * 8 = 80
將字符串拆分爲兩個最長的迴文
我試圖通過使用Longest Palindromic子序列的動態編程來解決這個問題,注意到我需要在創建兩個字符串時創建兩個最長的字符串。
蠻力的方法是嘗試對每個子序列的每一個迴文,這是我的嘗試:
using System;
namespace Palindrome
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(GetLongestPalindrome("nmmaddammhelloollehdertr"));
}
static int GetLongestPalindrome(string s)
{
int longest = 1;
for (int i = 0; i < s.Length; ++i)
longest = Math.Max(longest, GetLongestPalindromeHelper(s.Substring(0, i)) * GetLongestPalindromeHelper(s.Substring(i)));
return longest;
}
static int GetLongestPalindromeHelper(string str)
{
if (str.Length == 0)
return 1;
/*
* For a str = "madeam"
* || 0 | 1 | 2 | 3 | 4 | 5 ||
* _____|| m | a | d | e | a | m ||
* | 0 m || 1 | 1 | 1 | 1 | 1 |_5_||
* | 1 a || 0 | 1 | 1 | 1 |_3_| 3 ||
* | 2 d || 0 | 0 |_1_| 1 | 1 | 1 ||
* | 3 e || 0 | 0 | 0 | 1 | 1 | 1 ||
* | 4 a || 0 | 0 | 0 | 0 | 1 | 1 ||
* | 5 m || 0 | 0 | 0 | 0 | 0 | 1 ||
*
*/
int[,] matrix = new int[str.Length, str.Length];
// i -> row
// j -> column
// windowSize -> the numbers of chars in the window
// each character is a palindrome with a length 1
for (int i = 0; i < str.Length; ++i)
matrix[i, i] = 1;
// we handled windowSize 1, so we start at 2
for (int windowSize = 2; windowSize <= str.Length; ++windowSize)
{
for (int i = 0, j = windowSize - 1; i < str.Length - windowSize + 1; ++i, j = i + windowSize - 1)
{
if (str[i] == str[j])
matrix[i, j] = matrix[i + 1, j - 1] + 2;
else
matrix[i, j] = Math.Max(matrix[i, j - 1], matrix[i + 1, j]);
}
}
return matrix[0, str.Length - 1];
}
}
}
不過,我肯定有一個更好的方式來做到這一點,但我不知識。有什麼建議?另外,任何人都可以指出我的代碼的複雜性是什麼?
謝謝!
(1)它是不區分大小寫? (2)角色是否只包含A-Z? – Svek
我們假設給定的輸入始終是來自a-z的小寫字母 –
此外,此問題可能更適合於Code Review。 https://codereview.stackexchange.com/ – Svek