using System; using System.Runtime.InteropServices; namespace HJ32 { /// <summary> /// 密码截取/最长的回字符串字串 /// </summary> internal class Program { static void Main(string[] args) { var strInput = Console.ReadLine(); int count = GetPalindromeMaxCount01(strInput); //int count = GetPalindromeMaxCount02(strInput); Console.WriteLine(count); } /// <summary> 中心扩散法:以每一个字符为中心,向两边扩散,求最大回文串长度 </summary> static int GetPalindromeMaxCount01(string str) { if (string.IsNullOrEmpty(str)) { return 0; } var chars = str.ToCharArray(); int maxCount = 0; int length = chars.Length; //中心扩散法 for (int i = 0; i < length; i++) { int left = i - 1; int right = i + 1; //ABA型 while (true) { if (left >= 0 && right < length && chars[left] == chars[right]) { if (right - left + 1 > maxCount) { maxCount = right - left + 1; } //继续扩散,尝试取得最大长度 left--; right++; } else { break; } } //ABBA型 left = i; right = i + 1; while (true) { if (left >= 0 && right < length && chars[left] == chars[right]) { if (right - left + 1 > maxCount) { maxCount = right - left + 1; } //继续扩散,尝试取得最大长度 left--; right++; } else { break; } } } return maxCount; } /// <summary> /// 动态规划法 /// </summary> static int GetPalindromeMaxCount02(string str) { if (string.IsNullOrEmpty(str)) { return 0; } var chars = str.ToCharArray(); int maxCount = 0; int length = chars.Length; bool[,] dp = new bool[length, length]; for (int i = 0; i < length; i++) { for (int j = 0; j <= i; j++) { //此时指向同一个字符 if (i - j == 0) { //dp[j, i] = true表示j-i个字符形成的回文串 dp[j, i] = true; } else if (i - j == 1 && chars[j] == chars[i]) { dp[j, i] = true; } else { // 状态转移:如果左右两字符相等,并且[j+1...i-1]范围内的字符是回文子串 // 则 [j j+1...i-1 i] 即[j...i] 也是回文子串 if (chars[j] == chars[i] && dp[j + 1, i - 1]) { dp[j, i] = true; } } //更新最大长度 if (dp[j, i] && i - j + 1 > maxCount) { maxCount = i - j + 1; } } } return maxCount; } } }