5. 最长回文子串
原题链接:https://leetcode-cn.com/problems/longest-palindromic-substring/
class Solution { // 思路:【动态规划】 // 状态转移方程是 p[i,j] = p[i+1,j-1] && p[i] = p[j] // p[i,j] 表示第i个 和 第j 个是相同的 // 整体分两层循环【第一层按回文长度从零到n , 第二层就是字符从第一个开始往后循环】 public String longestPalindrome(String s) { int n = s.length(); // dp[i,j]=true 表示第i个 和 第j 个是相同的 boolean[][] dp = new boolean[n][n]; String res = ""; // 回文长度的维度 for (int length = 0; length < n; length++){ for (int i = 0; i + length < n; i++){ // i表示左边的下表,j 表示右边的下标 int j = i + length; // 只有一个字符的时候 if (length == 0){ dp[i][j] = true; } else if (length == 1){ // 只有两个字符的时候 dp[i][j] = (s.charAt(i) == s.charAt(j)); } else { dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]); } if (dp[i][j] && length + 1 > res.length()){ res = s.substring(i, i + length + 1); } } } return res; } }
注意点:
- 动态规划思维,能列出状态转移方程式并且能找到边界
-
s.substring(a,b)函数的用法,取得范围注意是[a,b) ,左闭右开的区间,substring方法的s为小写,白板上写的时候要注意这个点。