• [leetcode]Longest Palindromic Substring


    Longest Palindromic Substring

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

    很经典的DP问题:

    算法分析:

    思路1:最土的算法,将所有的子串求出来,再选出最长的回文子串。不用试,肯定超时。

    思路2:挑出最短的回文串(单个字符,或者两个相邻的相同字符),然后向两端辐射,时间复杂度O(n^2),空间复杂度可以优化到O(1)【我木有优化= =】

    代码如下:

     1     public String longestPalindrome(String s) {
     2         if(s == null || s.length() == 0) return "";
     3         String maxsub = "";
     4         for(int i = 0; i < s.length(); i++){
     5              String str = getPalindrome(s, i, i,s.length());
     6              if(str.length() > maxsub.length())
     7                  maxsub = str;
     8             if(i < s.length() - 1 && s.charAt(i) == s.charAt(i + 1)){
     9                  str = getPalindrome(s, i, i + 1,s.length());
    10                  if(str.length() > maxsub.length())
    11                      maxsub = str;
    12             }
    13         }
    14         return maxsub;
    15     }
    16     private String getPalindrome(String s,int begin,int end,int prime){
    17         while(begin >= 0 && end < s.length()){
    18             if(s.charAt(begin) == s.charAt(end)){
    19                 begin--;
    20                 end++;
    21             }else{
    22                 break;
    23             }
    24         }
    25         return s.substring(begin+1, end);
    26     }
    View Code

    思路3:DP

    参考同学的做法

    dp[i][j] 代表从i到j的子串是否是palindrome。自下而上自左而右计算dp数组。时空复杂度都是 O(n^2)。

        dp[i][j]=1  if:

    1.     i=j;
    2.     s.charAt(i)==s.charAt(j)    &&    j-i<2
    3.     s.charAt(i)==s.charAt(j)    &&    dp[i+1][j-1]==1
     1 public class Solution {
     2     public String longestPalindrome(String s) {
     3            if(s == null || s.length() == 0) return "";
     4             boolean[][] dp = new boolean[s.length()][s.length()];
     5             int start = 0, end = 0,len = 0;
     6             for(int i = s.length() - 1; i >= 0; i--){
     7                 for(int j = i; j < s.length(); j++){
     8                     if(i == j || (s.charAt(i) == s.charAt(j) && j - i == 1) || (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1])){
     9                         dp[i][j] = true;
    10                         if(j - i + 1 > len){
    11                             len = j - i + 1;
    12                             start = i;
    13                             end = j;
    14                         }
    15                     }
    16                 }
    17             }
    18             return s.substring(start, end + 1);
    19     }
    20 }
  • 相关阅读:
    CAN总线学习资料
    VMware虚拟机 硬盘空间不足 磁盘大小调整方案
    郭天祥-S3C2440开发板Linux2.6.31移植教程
    MFC串口编程——使用标准SerialCom类
    Luogu P2602 [ZJOI2010]数字计数 //数位DP
    luogu P1896 [SCOI2005] 互不侵犯 //状压DP
    中北大学ACM 5/12 T6 CSY的幸福
    P2473 || SCOI2008 奖励关 //状压&&期望DP
    请让蝴蝶爬满全身
    【图论】二分图 // 未完成 =、=
  • 原文地址:https://www.cnblogs.com/huntfor/p/3883871.html
Copyright © 2020-2023  润新知