public static string Solution2(string str) { Console.WriteLine(str); if (string.IsNullOrEmpty(str)) { return(str); } var s2 = AddBoundaries(str); var palindromes = new Palindrome[s2.Length]; var current = new Palindrome(0, 0); for (var i = 0; i < s2.Length; i++) { var min = current.Right > i ? Math.Min(current.Right - i, palindromes[current.GetMirrorCenter(i)].Length) : 0; palindromes[i] = new Palindrome(i, min); current = palindromes[i]; while (current.Left - 1 >= 0 && current.Right + 1 < s2.Length && s2[current.Left - 1] == s2[current.Right + 1]) { current.Expand(); } } var largest = palindromes.OrderByDescending(p => p.Length).First(); return(RemoveBoundaries(s2.Substring(largest.Left, largest.TotalLength))); }