https://leetcode-cn.com/problems/longest-palindromic-substring/solution/

方法一:中心扩展法

遍历字符串,以每个字符为中心,判断以其为中心的最长回文串长度。记录最长回文串的起始位置。注意回文串长度分奇偶两种情况。

  1. class Solution {
  2. public String longestPalindrome(String s) {
  3. if(s==null||s.length()<1) return s;
  4. //回文串左右位置
  5. int left=0;int right=0;
  6. for(int i=0;i<s.length();i++){
  7. //回文串长度为奇数
  8. int len1=lengthOfHuiwen(s,i,i);
  9. //长度为偶数
  10. int len2=lengthOfHuiwen(s,i,i+1);
  11. int len=Math.max(len1,len2);
  12. if(len>right-left){
  13. left=i-(len+1)/2+1;
  14. right=i+len/2;
  15. }
  16. }
  17. return s.substring(left,right+1);
  18. }
  19. //left,right为中心字符串左右位置
  20. public int lengthOfHuiwen(String s,int left,int right){
  21. int L=left,R=right;
  22. while(L>=0&&R<s.length()&&s.charAt(L)==s.charAt(R)){
  23. L--;
  24. R++;
  25. }
  26. return R-L-1;
  27. }
  28. }

方法二:动态规划

  1. (一)状态
  2. f[i][j]表示s的第 i 个字符到第 j 个字符组成的子串,是否为回文串
  3. (二)转移方程
  4. 如果s的第 i 个字符和第 j 个字符相同的话,且 i + 1, j - 1 的子串也是回文串的话,f[i][j] 也为回文串
  5. f[i][j] = f[i + 1][j - 1] and s[i] == s[j]
  6. 稍微要注意的是,如果 i == j 或者 i + 1 == j 的时候,也就是单个字符的子串和两个相邻字符的子串,就不需要f[i + 1][j - 1]了
  7. 注意遍历顺序,i 从最后一个字符开始往前遍历,j i 开始往后遍历,这样可以保证每个子问题都已经算好了。
  1. class Solution {
  2. public String longestPalindrome(String s) {
  3. int n=s.length();
  4. if(n<1||s==null) return s;
  5. String res="";
  6. boolean[][] flag=new boolean[n][n];
  7. for(int i=n-1;i>=0;i--){
  8. for(int j=i;j<n;j++){
  9. if(s.charAt(i)==s.charAt(j)&&(j-i<=1||flag[i+1][j-1])){
  10. flag[i][j]=true;
  11. if(res.length()<j-i+1)
  12. res=s.substring(i,j+1);
  13. }
  14. }
  15. }
  16. return res;
  17. }
  18. }


LeetCode      动态规划

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!