算法一枚:查找字符串中最长的对称子字符串

早晨打开博客园首页,看到一篇文章在介绍算法。一直以来对自己最不放心的就是算法方面——高中之后数学学习处停滞状态——反正今天时间有点充裕,就练练手吧。

解题思路:从前往后遍历字符串,发现一个对称点时,以这两点为中心,开始往前后扩散直到非对称为止。将此次扩散结果与已找到的对称字符串比较长度,谁长就保留谁,最终返回结果。它的算法复杂度为O(n2),不知道有没有更巧妙的算法可以更小。算法内部还可以加一些代码防止多余的计算次数,但这属于解题外的范畴,于是没有加进去.

题目说的是对称字符,结果被我先入为主地理解成偶数对称,所以这个算法里不包含奇数对称的处理。当然要加入也是挺简单的,不算什么。

public static string FindMaxSymmetry(string input)
{
if (input == null || input.Length < 2)
return string.Empty;

var foundStartIndex = 0;
var foundLength = 0;
for (int i = 0, endIndex = input.Length - 1; i < endIndex; i++)
{
int left = i;
int right = i + 1;
if (input[left] == input[right])//symmetry found
{
while (left > 0 && right < endIndex
&& input[left - 1].Equals(input[right + 1]))
{
left--;
right++;
}

var length = right - left + 1;
if (foundLength < length)
{
foundStartIndex = left;
foundLength = length;
}
}
}

return input.Substring(foundStartIndex, foundLength);
}



posted @ 2011-12-19 18:43  _龙猫  阅读(548)  评论(0编辑  收藏  举报