leetcode647. 回文子串

一:题目

在这里插入图片描述

二:上码

class Solution {
public:
    /**
        思路:
            动态规划五步走
            1>:确定dp数组以及下标的含义
                dp[i][j] 表示的是在[i,j]范围内的字串 是否是 回文子串,如果是的话那么dp[i][j] = true

            2>确定dp数组的状态转移方程
                那么就有两种情况 s[i] 与 s[j]是否相等,
                s[i]与s[j] 不相等的话  那么dp[i][j] = false;
                相等的话:
                    如果 i==j 的话  那么dp[i][j] = true,也就是dp[i][j]就是一个回文字符串,其实也就是网格中45度斜线
                如果 i 和 j 相差为1的话  比如 aa 即s[i] = a = s[0]  s[j] = a = s[1],注意这是在s[i] 和 s[j]
                                                                                    相等的情况下。
                如果i 和 j 相差的大于1的话:比如  cabac  此时s[i] = c  s[j] = c,那么我们判断该字符串到底是不是
                回文字符串主要是看  aba 是不是回文字符串,  那么aba 也就是 i+1  和 j-1 即dp[i+1][j-1]
                我们这里用的二维数组其实也就是 表示一个字符串

            3>确定dp数组的初始化
                初始化为false,因为一开始是不可能为true的,因为我们还没有进行比较。

            4>:确定dp数组的遍历顺序
                
                这是从网格的右下角开始往上
                            4 5 6
                              2 3      
                                1

            5>:举例验证:
                  a  a  a
                a 1  1  1  //这里当中的第一个1 就是第一种情况  第二个就是 第二种情况  第三个就是第三情况
                a    1  1
                a       1
    */

    int countSubstrings(string s) {
        
        vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));//这里初始化为0就是表示的是不是回文串
        
        int ans = 0;

        for (int i = s.size()-1; i >= 0; i--) {
            for (int j = i; j < s.size(); j++) {
                if (s[i] == s[j]) {
                    if (j - i <= 1) dp[i][j] = 1;//情况一情况二
                    else if (dp[i+1][j-1] == 1) dp[i][j] = 1;//情况三
                }
            }
        }

        // for(auto num: dp) {
        //     if (num == 1) ans++;
        // }
        for (int i = 0; i < s.size(); i++) {
            for (int j = 0; j < s.size(); j++) {
                if (dp[i][j] == 1) ans++;
            }
        }


        return ans;
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,有三种方法可以解决LeetCode上的最长回文子问题。 方法一是使用扩展中心法优化,即从左向右遍历字符,找到连续相同字符组成的子作为扩展中心,然后从该中心向左右扩展,找到最长的回文子。这个方法的时间复杂度为O(n²)。\[1\] 方法二是直接循环字符,判断子是否是回文子,然后得到最长回文子。这个方法的时间复杂度为O(n³),效率较低。\[2\] 方法三是双层for循环遍历所有子可能,然后再对比是否反向和正向是一样的。这个方法的时间复杂度也为O(n³),效率较低。\[3\] 综上所述,方法一是解决LeetCode最长回文子问题的最优解法。 #### 引用[.reference_title] - *1* [LeetCode_5_最长回文子](https://blog.csdn.net/qq_38975553/article/details/109222153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Leetcode-最长回文子](https://blog.csdn.net/duffon_ze/article/details/86691293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [LeetCode 第5题:最长回文子(Python3解法)](https://blog.csdn.net/weixin_43490422/article/details/126479629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值