小编典典

如何在给定的字符串中找到最长的回文?

algorithm

我知道如何在O(n ^ 2)中执行此操作。但似乎存在更好的解决方案。

我找到了这个,并且有一个指向O(n)答案的链接,但这是用Haskell编写的,对我来说还不清楚。

得到用c#或类似语言的答案将是很棒的。


阅读 302

收藏
2020-07-28

共1个答案

小编典典

我已经找到了解决方案的明确解释这里 。感谢Justin提供此链接。

在这里,您可以找到该算法的Python和Java实现(C ++实现包含错误)。

这是C#实现,仅是这些算法的翻译。

public static int LongestPalindrome(string seq)
    {
        int Longest = 0;
        List<int> l = new List<int>();
        int i = 0;
        int palLen = 0;
        int s = 0;
        int e = 0;
        while (i<seq.Length)
        {
            if (i > palLen && seq[i-palLen-1] == seq[i])
            {
                palLen += 2;
                i += 1;
                continue;
            }
            l.Add(palLen);
            Longest = Math.Max(Longest, palLen);
            s = l.Count - 2;
            e = s - palLen;
            bool found = false;
            for (int j = s; j > e; j--)
            {
                int d = j - e - 1;
                if (l[j] == d)
                {
                    palLen = d;
                    found = true;
                    break;
                }
                l.Add(Math.Min(d, l[j]));
            }
            if (!found)
            {
                palLen = 1;
                i += 1;
            }
        }
        l.Add(palLen);
        Longest = Math.Max(Longest, palLen);
        return Longest;
    }
2020-07-28