• Longest Palindromic Substring & Longest Palindromic Subsequence


    5. Longest Palindromic Substring

    题目链接:https://leetcode.com/problems/longest-palindromic-substring/#/description

    题目大意:给定一个字符串s,返回该字符串的最长回文子串。s的最大长度不超过1000.

    思路:对于每个子串的中心(可以是一个字符,或者是两个字符的间隙,比如串abc,中心可以是a,b,c,或者是ab的间隙,bc的间隙)往两边同时进行扫描,直到不是回文串为止。假设字符串的长度为n,那么中心的个数为2*n-1(字符作为中心有n个,间隙有n-1个)。

    算法复杂度:对于每个中心往两边扫描的复杂度为O(n),所以时间复杂度为O(n^2),空间复杂度为O(1)

    代码:

     1 class Solution {
     2 public:
     3     string longestPalindrome(string s) {
     4         if (s == "")
     5             return s;
     6         int start = 0, maxLen = 1;
     7         for (int i = 1; i < s.size(); ++i) {
     8             expandStr(s, i - 1, i, start, maxLen);
     9             expandStr(s, i - 1, i + 1, start, maxLen);
    10         }
    11         return s.substr(start, maxLen);
    12     }
    13 private:
    14     void expandStr(string &s, int low, int high, int &start, int &maxLen) {
    15         while (low >= 0 && high < s.size() && s[low] == s[high]) {
    16             --low;
    17             ++high;
    18         }
    19         if (high - low - 1 > maxLen) {
    20             start = low + 1;
    21             maxLen = high - low - 1;
    22         }
    23     }
    24 };

    评测系统上运行结果:

    516. Longest Palindromic Subsequence

    题目链接:https://leetcode.com/problems/longest-palindromic-subsequence/#/description

    题目大意:给定一个字符串s,返回该字符串的最长回文子序列。s的最大长度不超过1000.

    思路:使用动态规划。longest数组记录字符串[i,j]范围的最长回文序列,动态转移方程为longest[l][r] = longest[l+1][r-1] + 2 if s[l] == s[r] else longest[l][r] = max(longest[l+1][r], longest[l][r-1]).

    算法复杂度:时间复杂度为O(n^2),空间复杂度为O(n^2)

    代码:

     1 class Solution {
     2 public:
     3     int longestPalindromeSubseq(string s) {
     4         if (s.empty())
     5             return 0;
     6         vector<vector<int>> longest(s.size(), vector<int>(s.size()));
     7         for (int len = 1; len <= s.size(); ++len)
     8             for (int l = 0; l + len <= s.size(); ++l) {
     9                 int r = l + len - 1;
    10                 if (l == r)
    11                     longest[l][r] = 1;
    12                 else if (s[l] == s[r])
    13                     longest[l][r] = longest[l+1][r-1] + 2;
    14                 else
    15                     longest[l][r] = max(longest[l+1][r], longest[l][r-1]);
    16             }
    17         return longest[0][s.size() - 1];
    18     }
    19 };

    评测系统上运行结果:

  • 相关阅读:
    Mysql 主从设置
    HTTP协议--请求与响应
    Memcahce(MC)系列(一)Memcache介绍、使用、存储、算法、优化
    Nginx配置性能优化
    PHP版本--HTTP session cookie原理及应用
    MYSQL 优化常用方法
    linux查询系统负载
    一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈
    数据库SQL SELECT查询的工作原理
    Unity使用UGUI进行VR游戏的界面开发
  • 原文地址:https://www.cnblogs.com/gxhblog/p/6657569.html
Copyright © 2020-2023  润新知