首页 > 其他分享 >【Leetcode】5-最长回文子串

【Leetcode】5-最长回文子串

时间:2023-06-08 13:03:27浏览次数:46  
标签:子串 int 复杂度 vector ans Leetcode dp 回文


1.一般方法:暴力for循环求解,时间复杂度

,空间复杂度

【Leetcode】5-最长回文子串_字符串


2.动态规划:我们发现在匹配过程中有许多重复计算的部分,我们把这些放到一个表里保存起

来会减少运算,用空间换时间。时间复杂度

,空间复杂度


例如“babab”字符串对应的表为:

【Leetcode】5-最长回文子串_空间复杂度_02

dp[i][j]为TRUE代表字符串从i到j为回文串。判断i到j是否为回文串的问题转换为s[i]是否等于s[j],

若相等,查询除去该串首尾字符的子串状态,即dp[i-1][j+1]是否为回文串。

dp[i-1][j+1]是左下方的状态,因此循环应该从对角线往右上方计算,对应图中红色箭头的方向。

状态转移方程为dp[i][j]= (s[i]==s[j] &&(s[i-1][j+1] || j-i<3))

注意j-i<3时只需要判断s[i]==s[j]即可,即只有三个字符或以下的情况。

 

vector< vector<int> > dp(n, vector<int>(n) );定义了一个vector容器,元素类型为vector<int>,

初始化为包含n个vector<int>对象,每个对象都是一个新创立的vector<int>对象的拷贝,而

这个新创立的vector<int>对象被初始化为包含n个0。

在状态转移方程中,我们是从长度较短的字符串向长度较长的字符串进行转移的,因此一定要注意动态规划的循环顺序。

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        vector<vector<int>> dp(n, vector<int>(n));
        string ans;//初始为空字符串。
        for (int l = 0; l < n; ++l) {//l+1代表回文串长度,我们从1个字符自身开始循环
            for (int i = 0; i + l < n; ++i) {//i代表起始下标,l代表终止下标
                int j = i + l;
                if (l == 0) {//对角线情况,只有一个字符
                    dp[i][j] = 1;//代表从i到j是回文串
                }
                else if (l == 1) {//i和j相差1,只有两个字符
                    dp[i][j] = (s[i] == s[j]);
                } 
                else {//一般情况
                    dp[i][j] = (s[i] == s[j] && dp[i + 1][j - 1]);
                }
                if (dp[i][j] && l + 1 > ans.size()) {//l+1是当前回文串的长度
                    ans = s.substr(i, l + 1);
                }
            }
        }
        return ans;
    }
};

标签:子串,int,复杂度,vector,ans,Leetcode,dp,回文
From: https://blog.51cto.com/u_15983387/6439046

相关文章

  • [LeetCode] 1351. Count Negative Numbers in a Sorted Matrix
    Givena mxn matrix grid whichissortedinnon-increasingorderbothrow-wiseandcolumn-wise,return thenumberof negative numbersin grid.Example1:Input:grid=[[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]Output:8Explanation:Thereare......
  • 递归-二叉搜索树-leetcode98验证二叉搜索树
    //leetcodesubmitregionbegin(Prohibitmodificationanddeletion)/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=......
  • LeetCode 90. 子集 II
    classSolution{public:unordered_map<int,int>cnt;vector<vector<int>>res;vector<int>path;vector<vector<int>>subsetsWithDup(vector<int>&nums){for(autoi:nums)cnt......
  • 【leetcode】21. Merge Two Sorted Lists
    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]提示:两个链表的节点数目范围是[0,......
  • Leetcode 2611. 老鼠和奶酪
    题目:有两只老鼠和 n 块不同类型的奶酪,每块奶酪都只能被其中一只老鼠吃掉。下标为i 处的奶酪被吃掉的得分为:如果第一只老鼠吃掉,则得分为 reward1[i] 。如果第二只老鼠吃掉,则得分为 reward2[i] 。给你一个正整数数组 reward1 ,一个正整数数组 reward2 ,和一个非负整......
  • 516. 最长回文子序列
    给你一个字符串s,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例1:输入:s="bbbab"输出:4解释:一个可能的最长回文子序列为"bbbb"。>动态规划classSolution{public:......
  • 647. 回文子串
    给你一个字符串s,请你统计并返回这个字符串中回文子串的数目。回文字符串是正着读和倒过来读一样的字符串。子字符串是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。输入:s="abc"输出:3解释:三......
  • 【每日一题】LeetCode 859. 亲密字符串
    题目描述给你两个字符串s和goal,只要我们可以通过交换s中的两个字母得到与goal相等的结果,就返回true;否则返回false。交换字母的定义是:取两个下标i和j(下标从0开始)且满足i!=j,接着交换s[i]和s[j]处的字符。例如,在“abcd”中交换下标0和下标2的元素可以......
  • 【每日一题】LeetCode 390. 消除游戏
    题目列表arr由在范围[1,n]中的所有整数组成,并按严格递增排序。请你对arr应用下述算法:从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾。重复上面的步骤,但这次是从右到左。也就是,删除最右侧的数字,然后剩下的数字每隔一个删除一个。不断重复这两步,从左到右......
  • 【每日一题】LeetCode 786. 第K个最小的素数分数(待补全题解思路)
    题目给你一个按递增顺序排序的数组arr和一个整数k。数组arr由1和若干素数组成,且其中所有整数互不相同。对于每对满足0<i<j<arr.length的i和j,可以得到分数arr[i]/arr[j]。那么第k个最小的分数是多少呢?以长度为2的整数数组返回你的答案,这里answer......