您的位置:首页 > 编程语言 > C#

【每日算法】删减字符获得最大回文符

2016-05-25 23:06 375 查看
题一:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?

输出需要删除的字符个数。

例如:sleep 需要删除3个(’s’ ‘l’ ‘p’),剩下“ee”就是回文符。

google 需要删除2个(’l’ ‘e’),剩下“goog”。

我在C#上实现这个算法。下面做了个窗口运行,下面是运行截图:



如上图所示”google”,需要删除两个字符。

这个问题是要我们求删除的字符数,其实在另一方面是要我们求出最长的回文串,然后用原字符长度减去最长回文串长度就是要求的删除字符个数。

也就是说要求出最长回文串。

关于回文串

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。

最初的想法是将字符串反转,所得的反转字符与原字符比较,求得最大的回文串。

最笨的办法是从两头开始循环比较。

以下是代码片段(最大回文串长度):

String s1 = str;
String s2 = Reverse(str);
int length = s1.Length;
int[,] temp = new int[length+1, length+1];
/**
* 这个无关紧要
*/
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length; j++)
{
temp[i, j] = 0;
}
}
/**
* 以下开始匹配
*/
for (int i = 0; i < length; ++i)
{
for (int j = 0; j < length; ++j)
{
if (s1[i] == s2[j])
{
temp[i + 1, j + 1] = temp[i, j] + 1;
}
else
{
temp[i + 1, j + 1] = Math.Max(temp[i, j + 1], temp[i + 1, j]);
}
}
}
return temp[length,length];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 c#