• string+DP leetcode-4.最长回文子串


    5. 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.

    找出给定数组中,最长的回文子串。最长输入尾1000。

    样例

    Example 1:

    Input: "babad"
    Output: "bab"
    Note: "aba" is also a valid answer.
    

    Example 2:

    Input: "cbbd"
    Output: "bb"

    Example 3:

    Input: "abcd"
    Output: "a"

    Example 4:

    Input: "eeeeeeeeeeeeeeeeeeeeee"
    Output: "eeeeeeeeeeeeeeeeeeeeee"

    思路1:暴力,不可行。

    判断每一个字串是否是回文串,找出最长。

    事件复杂度:O(n3)   (1000的输入, n3复杂度, 10003=109,会超1000ms)

     1 class Solution {
     2 public:
     3     string longestPalindrome(string s) {
     4         string res = "";
     5         int len = s.length();
     6         if(len == 0 || len == 1)
     7             return s;
     8 
     9         for(int i=0; i<len; i++)
    10         {
    11             string tmpStr = "";
    12             tmpStr += s[i];
    13             int j = i+1;
    14             for(; j<len; j++)
    15             {
    16                 if(s[j] != s[i])
    17                     tmpStr += s[j];
    18                 else
    19                 {
    20                     tmpStr += s[j];
    21                     if(judge(tmpStr) && tmpStr.length() > res.length())
    22                         res = tmpStr;
    23                 }
    24             }
    25         }
    26         if(res.length() == 0)
    27             res += s[0];
    28         return res;
    29     }
    30     
    31     bool judge(string s)
    32     {
    33         int len = s.length();
    34         for(int k=0; k<=len/2; k++)
    35             if(s[k] != s[len-1-k])
    36                 return false;
    37         return true;
    38     }
    39 };

    思路2:DP

     1 class Solution {
     2 public:
     3     string longestPalindrome(string s) {
     4         int len = s.length();
     5         if(len < 2)
     6             return s;
     7         bool dp[len][len] = {0};
     8         int start = 0, span = 1;
     9         
    10         for(int i=0; i<len; i++)
    11         {
    12             dp[i][i] = 1;
    13             for(int j=0; j<i; j++)
    14             {
    15                 dp[j][i] = (s[i]==s[j] && (i-j < 2 || dp[j+1][i-1]));
    16                 if(dp[j][i] && (i-j+1 > span))
    17                 {
    18                     span = i-j+1;
    19                     start = j;
    20                 }
    21             }
    22         }
    23         return s.substr(start, span);
    24     }
    25 };
  • 相关阅读:
    虚拟机黑屏
    ngnix随笔三
    ngnix随笔二
    ngnix随笔一
    HTML(初级)笔记
    学习Java注解
    常用工具类与commons 类库
    SpringBoot缓存使用
    LeetCode:98.验证二叉搜索树
    剑指Offer:面试题07.重建二叉树
  • 原文地址:https://www.cnblogs.com/yocichen/p/10830712.html
Copyright © 2020-2023  润新知