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.

Example:

Input: “babad”

Output: “bab”

Note: “aba” is also a valid answer.
Example:

Input: “cbbd”

Output: “bb”

计算最长回文子序列

解析

参考博客1
动态规划求解最长子串的长度
状态初始条件:

dp[i][i]=1i=0n1)

状态转移方程:
dp[i][j]=dp[i+1][j1]+2(str[i]==str[j])

dp[i][j]=max(dp[i+1][j],dp[i][j1])ifstr[i]!=str[j]

最终返回 dp[0][n1]
计算dp[i][j]时需要计算dp[i+1][ ]或dp[][j-1],因此i应该从大到小,即递减;j应该从小到大,即递增。

代码:

以下代码为根据该思路写的【一本正经】,且是求最长回文子序列广为流传的代码。看我main中的测试样例pwwkew,最终结果为3,因为dp[3][4] = 1,计算dp[2][5]时,就是dp[3][4]+2 = 3,而非正确结果2。找的多个博客代码运行起来都一样,怎么肥四?有猫病??先放着吧,可能哪儿细节我没看清?

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<unordered_map>
using namespace std;

// 按照转移方程自己打的
class Solution {
public:
    int longestPalindrome(string s) {
        // matrix[i][j]是s下标从i到j的子串中最长回文子序列的长度
        int size = s.size();
        vector<vector<int>> dp(size, vector<int>(size, 0));

        for (int j = 0; j < size; j++) {
            dp[j][j] = 1;
            for (int i = j - 1; i >= 0; i--) {
                if (s[i] == s[j]) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                }
                else {
                    dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[0][size - 1];
    }
};
// 另外一种博客上做法,总体思路还是一致
int lpsDp(string str, int n)
{
    int dp[6][6], tmp;
    memset(dp, 0, sizeof(dp));

    //字符串长度为1,最长回文子序列的长度就是1  
    for (int i = 0; i < n; ++i)  dp[i][i] = 1;

    for (int i = 1; i < n; ++i)
    {
        tmp = 0;
        //考虑所有连续的长度为i+1的子串,str[j....j+i]  
        for (int j = 0; j + i < n; j++)
        {
            //如果首尾相同  
            if (str[j] == str[j + i])
                tmp = dp[j + 1][j + i - 1] + 2;
            //如果首尾不同  
            else
                tmp = max(dp[j + 1][j + i], dp[j][j + i - 1]);
            dp[j][j + i] = tmp;
        }
    }
    return dp[0][n - 1]; //返回字符串str[0...n-1]的最长回文子序列长度  
}
int main() {
    string str = "pwwkew";
    Solution solution;
    //int res = solution.longestPalindrome(str);
    int res = lpsDp(str, str.size());
    cout << res << endl;
    system("pause");
    return 0;
}

就题论题

解析:

来自原题的solution
相应AC代码:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<unordered_map>
using namespace std;

class Solution {
public:
    string longestPalindrome(string s) {
        // matrix[i][j]是s下标从i到j的子串是否是回文串
        int size = s.size();
        vector<vector<bool>> dp(size, vector<bool>(size, false));
        for (int i = 0; i < size; i++) {
            dp[i][i] = true;  // 奇数情况初始化
            if (i < size - 1) {
                dp[i][i + 1] = (s[i] == s[i + 1]);  // 偶数情况初始化
            }
        }
        // 转移方程
        for (int window = 3; window <= size; window++) {
            for (int index = 0; index + window - 1 < size; index++) {
                dp[index][index + window - 1] = (s[index] == s[index + window - 1]) && dp[index + 1][index + window - 2];
            }
        }
        // 找出dp[index][index + window - 1]为true,window最大的子序列
        int index, window;
        for (window = size; window > 0; window--) {
            bool flag = false;
            for (index = 0; index < size - window + 1; index++) {
                if (dp[index][index + window - 1]) {
                    flag = true;
                    break;
                }
            }
            if (flag)
                break;
        }
        string substring;
        substring.assign(s, index, window);
        return substring;
    }
};

int main() {
    string str = "abcba";
    Solution solution;
    string res = solution.longestPalindrome(str);
    cout << res << endl;
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽B代驾管理系统对代驾订单管理、用户咨询管理、代驾订单评价管理、代驾订单投诉管理、字典管理、论坛管理、公告管理、新闻信息管理、司机管理、用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行辽B代驾管理系统程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。辽B代驾管理系统的开发让用户查看代驾订单信息变得容易,让管理员高效管理代驾订单信息。 辽B代驾管理系统具有管理员角色,用户角色,这几个操作权限。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看代驾订单,删除代驾订单操作,新增代驾订单操作,修改代驾订单操作。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。新闻管理页面,此页面提供给管理员的功能有:新增新闻,修改新闻,删除新闻。新闻类型管理页面,此页面提供给管理员的功能有:新增新闻类型,修改新闻类型,删除新闻类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值