好多天没有更新了,今天有空,刷一道。

算法第5题

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring

  这道题有多种解法,用了这位网友关于动态规划的思路完成的,传送门

 1     public class Solution
 2     {
 3         public string LongestPalindrome(string s)
 4         {
 5             var length = s.Length;
 6
 7             if (length <= 1)
 8             {
 9                 return s;
10             }
11
12             bool[,] status = new bool[length, length];
13
14             var strArray = s.ToCharArray();
15             var palindromeLength = 1;
16             var palindrmoeStr = strArray.First().ToString();
17
18             for (int r = 1; r < length; r++)
19             {
20                 for (int l = 0; l < r; l++)
21                 {
22                     if (strArray[l] == strArray[r] && (r - l <= 2 || status[l + 1, r - 1]))
23                     {
24                         status[l, r] = true;
25
26                         if (r - l + 1 > palindromeLength)
27                         {
28                             palindromeLength = r - l + 1;
29                             palindrmoeStr = s.Substring(l, palindromeLength);
30                         }
31                     }
32                 }
33             }
34
35             return palindrmoeStr;
36         }
37     }

  这道题的关键点在于如何判断一个字符串是不是“回文”。所谓“回文”,就是说这个字符串正序和逆序的结果是相同的。因此,如果这个字符串是回文,那么它的首字母和尾字母是相同的。并且对于一个“回文”的字符串来说,如果我们拿掉了首字母和尾字母,剩下的部分应该依然是回文。

  因此我们可以这么来判断一个字符串是不是“回文”,如果它的首尾字母相同,我们就去掉这个字符串的首尾字符,(否则说明这个字符串满足条件)最终会得到长度为2,或3的子字符串。此时如果首尾依旧相同,那么我们就可以说这个字符串是满足条件的了。也就是说我们可以利用子的字符串是不是“回文”,来判断父字符串是不是回文了。

  

12-14 07:33
查看更多