longestPalindrome给定一个字符串 s,找到 s 中最长的回文子串。

/**
 * 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
 * 示例 1:
 * 输入: "babad"
 * 输出: "bab"
 * 注意: "aba" 也是一个有效答案。
 * 示例 2:
 * 输入: "cbbd"
 * 输出: "bb"
 * 思路:两种方法;暴力法:
 *  设置两个变量,变量i遍历字符串,变量j以i为中心,想左右两边扩张的比较,比如i+j,i-j,j从1开始不断
 *  增加。这种解法要判断字符串的长度是奇数还是偶数。可以在字符串中的字符两边都添加#,这样不管
 *  字符串长度是奇数还是偶数,都变成奇数处理,比如babad可以变成#b#a#b#a#d#
 *  时间复杂度O(N*M)
 *  方法二:动态规划
 *  难度主要还是递推公式的推导,维护一个二维数组 dp,其中 dp[i][j] 表示字符串区间 [i, j] 是否为回文串,
 *  当 i = j 时,只有一个字符,肯定是回文串,如果 i = j + 1,说明是相邻字符,此时需要判断 s[i] 是否等
 *  于 s[j],如果i和j不相邻,即 i - j >= 2 时,除了判断 s[i] 和 s[j] 相等之外,dp[i + 1][j - 1]
 *  若为真,就是回文串,通过以上分析,可以写出递推式如下:
 *dp[i, j]     = 1                                                if i == j
 *               = s[i] == s[j]                                 if j = i + 1
 *               = s[i] == s[j] && dp[i + 1][j - 1]    if i-j>=2
 *   时间复杂度是O(n^2),空间复杂度是O(N^2)。
 *
 *   大致直白的解释一下遍历过程:比如"babad" ,
 *   i是轴,j只能存在i之前,代码中体现是
 *   for(int i ;i=2){
                    dp[j][i]=(s.charAt(i) == s.charAt(j)&&dp[j+1][i-1]);
                }
                if (dp[j][i]&&length

你可能感兴趣的:(算法练习-字符串)