zoukankan      html  css  js  c++  java
  • 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 };

    评测系统上运行结果:

  • 相关阅读:
    js对象数组(JSON) 根据某个共同字段 分组
    一个 函数 用来转化esSearch 的range 条件
    关于 vuex 报错 Do not mutate vuex store state outside mutation handlers.
    android listview 重用view导致的选择混乱问题
    android SDK和ADT的更新
    Android中adb push和adb install的使用区别
    pycharm中添加扩展工具pylint
    su Authentication failure解决
    Putty以及adb网络调试
    有关android源码编译的几个问题
  • 原文地址:https://www.cnblogs.com/gxhblog/p/6657569.html
Copyright © 2011-2022 走看看