回文字串的问题,学算法的时候曾经见过,使用动态规划就可以解决,初始化单个和双字符就可以,之后通过判断新串两端的字符是否相等和内部是否为回文串就可以判断新串是否为回文串。
public string LongestPalindrome(string s)
{
if(s.Length == 0)
{
return s;
}
bool[, ] test = new bool[s.Length, s.Length];
int maxLength = 1, maxJ = 0;
test[0, 0] = true;
for (int j = 1; j < s.Length; j++)//初始化单字串和双字串
{
test[j, j] = true;
if (s[j - 1] == s[j])
{
test[j - 1, j] = true;
if(maxLength < 2)
{
maxLength = 2;
maxJ = j;
}
}
else
{
test[j - 1, j] = false;
}
}
for (int len = 3; len <= s.Length; len++)//根据子串长度进行迭代
{
for (int j = len - 1; j < s.Length; j++)
{
if(test[j - len + 2, j - 1] && s[j - len + 1] == s[j])//如果两端相等且内部是回文串
{
test[j - len + 1, j] = true;//记录
if (maxLength < len)//更新最大长度
{
maxLength = len;
maxJ = j;//记录子串位置
}
}
else
{
test[j - len + 1, j] = false;//记录
}
}
}
return s.Substring(maxJ - maxLength + 1, maxLength);//根据记录的位置返回
}
虽然这样可以做出来,但是效率似乎有点低,明天再看看其他方法吧。