diff --git a/5. Longest Palindromic Substring/Program.cs b/5. Longest Palindromic Substring/Program.cs index 1bc52a6..e7ca51f 100644 --- a/5. Longest Palindromic Substring/Program.cs +++ b/5. Longest Palindromic Substring/Program.cs @@ -1 +1,18 @@ -Console.WriteLine("Hello, World!"); +var sol = new Solution(); + +var cases = new (string input, string expected)[] +{ + ("babad", "bab"), + ("cbbd", "bb"), + ("a", "a"), + ("ac", "a"), + ("forgeeksskeegfor", "geeksskeeg"), + ("abba", "abba"), + ("racecar", "racecar") +}; + +foreach (var (input, expected) in cases) +{ + var actual = sol.LongestPalindrome(input); + Console.WriteLine($"{input} -> {actual} (expected: {expected})"); +} diff --git a/5. Longest Palindromic Substring/Solutuion.cs b/5. Longest Palindromic Substring/Solutuion.cs new file mode 100644 index 0000000..c21ac72 --- /dev/null +++ b/5. Longest Palindromic Substring/Solutuion.cs @@ -0,0 +1,56 @@ +using System.Text; + +public class Solution +{ + public string LongestPalindrome(string s) + { + if (string.IsNullOrEmpty(s)) + return ""; + var str = PrepareString(s); + var radii = new int[str.Length]; + var set = new HashSet(); // Индексы радиусов для обработки + var answer = string.Empty; + + for (var i = 0; i < str.Length; i++) + { + var sym = str[i]; + var toRemove = new List(); + foreach (var radiusIdx in set) + { + var new_radius = radii[radiusIdx] + 1; + // Если с новым радиусом выходим за границы + if (radiusIdx - new_radius < 0 || radiusIdx + new_radius >= str.Length || str[radiusIdx - new_radius] != sym) + { + var len = radii[radiusIdx] * 2 + 1; + if (len > answer.Length) + answer = str.Substring(radiusIdx - radii[radiusIdx], len); + toRemove.Add(radiusIdx); + } + else + radii[radiusIdx] = new_radius; + } + foreach (var removeIdx in toRemove) + set.Remove(removeIdx); + + set.Add(i); + } + + foreach (var radiusIdx in set) + { + var len = radii[radiusIdx] * 2 + 1; + if (len > answer.Length || answer == "#") + answer = str.Substring(radiusIdx - radii[radiusIdx], len); + } + + return answer.Replace("#", ""); + } + + public string PrepareString(string s) + { + var sb = new StringBuilder(); + sb.Append('#'); + foreach (var ch in s) + sb.Append($"{ch}#"); + return sb.ToString(); + } +} \ No newline at end of file