题目链接

最长回文子串

题目描述

image.png

实现代码

思路:首先可以知道,对任意从第i个位置到第j个位置的子串s[i][j],判断其是否为最长回文串的依据可以通过其子串s[i+1][j-1] 及s[i]==s[j]判断出来,同时,我们通过自底向上的形式进行回文串的查找并对起始点和回文串长度进行跟踪记录,最终解出答案;

因此,判断子串是否为回文串可以通过下列状态转移方程进行判断:

dp[i][j] = dp[i+1][j-1] && (s.charAt(i} == s.charAt(j))

同时,需要对边界值进行初始化:

  1. i = j时, dp[i][j] = true
  2. i > j时,dp[i][j] = true;为什么设置为true,是因为通过状态转移方程进行计算时使用的是逻辑与

实现代码:

  1. class Solution {
  2. public String longestPalindrome(String s) {
  3. int len = s.length();
  4. boolean[][] dp = new boolean[len][len];
  5. for (int i = 0; i < len; i++) {
  6. for(int j=0; j<len; j++) {
  7. if(i >= j) {
  8. dp[i][j] = true;
  9. }
  10. }
  11. }
  12. int startIdx = 0;
  13. int resLen = 1;
  14. for (int subLen = 2; subLen <= len; subLen++) {
  15. for (int i = 0; i <= len - subLen; i++) {
  16. int j = i + subLen - 1;
  17. dp[i][j] = dp[i+1][j-1] && (s.charAt(i) == s.charAt(j));
  18. if(dp[i][j] && subLen > resLen) {
  19. startIdx = i;
  20. resLen = subLen;
  21. }
  22. }
  23. }
  24. return s.substring(startIdx, startIdx+resLen);
  25. }
  26. }