vlambda博客
学习文章列表

从最长回文字符串看动态规划以及C++容器基本知识

1. 题目描述

给你一个字符串 s,找到 s 中最长的回文子串。

2. C++ std::string中size()和length()的区别

As per the documentation, these are just synonyms. size() is there to be consistent with other STL containers (like vector, map, etc.) and length() is to be consistent with most peoples' intuitive notion of character strings. People usually talk about a word, sentence or paragraph's length, not its size, so length() is there to make things more readable.

正如文档所说,这两个函数其实是一样的。但是size()函数和其他STL容器(比如说vector, map) 这些函数的操作比较一致。而 length() 和人们的直觉比较一致。所以如果是字符串的话,用 length() 更具有可读性。

3. C++中vector容器初始化

我们首先用一些例子来看如何初始化一个 vector。

  1. 下面的例子初始化了一个长度为0的 vector v.

std::vector<int> v;
  1. 下面的例子和int array [] = {1, 2, 3, 4};比较类似,但是需要C++11。

std::vector<int> v = {1234};
  1. 和第一种情况类似,但是这里 vector v 的初始化长度为 k,里面的值为0。

std::vector<int> v(k);
  1. 和例3类似,但是这里每个元素都被初始化为 n。

std::vector<int> v(k, n);
  1. 初始化一个二维的vector,这个vector一共有 k 个元素,每个元素都被初始化为一个 vector,里面的元素只有一个数 n。

前面例子中的 int 只是作为一个例子,可以换成其他任何合法的数据类型。

4. 代码

在动态规划里面,如果一个index在i和j之间的子串要为回文字串的话,需要它的子问题(i-1)和(j-1)之间的字串也为回文子串。
算法的复杂度

#include <iostream>
#include <vector>

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.length();
        if (n < 2) {
            return s;
        }

        int maxLen = 1;
        int begin = 0;
        vector<vector<int>> dp(n, vector<int>(n));
        for (int i=0; i<n; i++) {
            dp[i][i] = 1;
        }

        for (int L=2; L <= s.length(); L++) {
            for (int i=0; i<s.length(); i++) {
                int j = i + L - 1;
                if (j >= n) {
                    break;
                }
                if (s[i] != s[j]) {
                    dp[i][j] = 0;
                } else {
                    if ((j-i) <= 2) {
                        dp[i][j] = 1;
                    } else {
                        dp[i][j] = dp[i+1][j-1];
                    }
                }

                if (dp[i][j] == 1 && (j-i+1) > maxLen) {
                        maxLen = j - i + 1;
                        begin = i;
                }
            }
        }

        return s.substr(begin, maxLen);
    }
};

参考:

  • https://stackoverflow.com/questions/905479/stdstring-length-and-size-member-functions

  • http://en.cppreference.com/w/cpp/string/basic_string

  • https://www.quora.com/What-is-the-difference-between-vector-int-v-N-and-vector-int-v-N