一、题目内容

image.png

二、题解

解法1:

思路

动态规划
令dp[i][j]表示S[i]至S[j]所表示的子串是否是回文子串,是则为1,不是为0。

  • 若S[i]=S[j]
    • 那么只要S[i+1]和S[j-1]是回文子串,S[i+1]至S[j-1]就是回文子串;
    • 如果S[i+1]至S[j-1]不是回文子串,则S[i]至S[j]一定不是回文子串。
  • 若S[i]!=S[j]
    • 那S[i]至S[j]一定不是回文子串。

image.png

代码

  1. public class Solution {
  2. public int getLongestPalindrome(String s, int n) {
  3. // write code here
  4. if (n < 2) {
  5. return s.length();
  6. }
  7. int maxLen = 1;
  8. boolean[][] dp = new boolean[n][n];
  9. for (int right = 1; right < n; right++) {
  10. for (int left = 0; left <= right; left++) {
  11. if (s.charAt(left) != s.charAt(right)) {
  12. continue;
  13. }
  14. if (right == left) {
  15. dp[left][right] = true;
  16. } else if (right - left <= 2) {
  17. //类似于"aa"和"aba",也是回文子串
  18. dp[left][right] = true;
  19. } else {
  20. //类似于"a******a",要判断他是否是回文子串,只需要
  21. //判断"******"是否是回文子串即可
  22. dp[left][right] = dp[left + 1][right - 1];
  23. }
  24. //如果字符串从left到right是回文子串,只需要保存最长的即可
  25. if (dp[left][right] && right - left + 1 > maxLen) {
  26. maxLen = right - left + 1;
  27. }
  28. }
  29. }
  30. return maxLen;
  31. }
  32. }