我正在使用一种算法,该算法应该在给定字符串中找到最长的回文。到目前为止,我已经做了一些研发并得到了一个与我的几乎相似的解决方案。经过一些调整后,到目前为止得到以下结果:
public static string Find_LongestPalindrome(string s)
{
var charsArray = s.ToCharArray();
var boolArr = new bool[charsArray.Length, charsArray.Length];
int longestStart = 0;
int maxLength = 1;
//By default, the matching array indexes are kept true for tracking similar characters
for (int i = 0; i < charsArray.Length; i++)
{
boolArr[i, i] = true;
}
for (int i = 0; i < charsArray.Length - 1; i++)
{
//This checks if there are matching characters and their length in the given string
if (charsArray[i] == charsArray[i + 1])
{
boolArr[i, i + 1] = true;
longestStart = i;
maxLength = 2;
}
}
//Keeps track of the character length that has length of two in a substring
for (int length = 2; length <= charsArray.Length; length++)
{
for (int i = 0; i < charsArray.Length - length + 1; i++)
{
int j = i + length - 1;
if (charsArray[i] == charsArray[j] && boolArr[i + 1, j - 1])
{
boolArr[i, j] = true;
if (maxLength < (j - i))
{
maxLength = j - i;
longestStart = i;
}
}
}
}
//Returns the substring that's found
if (s.Length == longestStart + (maxLength + 1))
{
return s.Substring(longestStart, maxLength + 1);
}
else
{
return s = "none";
}
}
这是我迄今为止所做的小提琴:最长的回文
上述解决方案有效,但无法为以下输入之一获得所需的解决方案:
(这里的逻辑是在给定字符串中找到长度至少为2或更大的最长回文)
输入 1:
hellosmithsannas
输出 1: sannas
hellosannasmith
输出 2: sannas
abcdefgg
输出 3:none
在我的例子中,我尝试的代码能够针对输入 1 和 3 运行。但是对于输入 2,我得到
none
,尽管它应该返回 sannas
,因为最小长度为 2 并且最长的字符串是在一个模式中找到的。这里有什么我错过的吗?
if (s.Length == longestStart + (maxLength + 1))
意味着您只对字符串末尾出现的最长回文感兴趣。要考虑其他位置的回文,应该是:
if (maxLength > 1)