回文判断_最长回文子串_分割回文串

目录

一,判断是否回文

二,最长回文子串

三,分割回文串 


一,判断是否回文

leetcode 125

1,双指针:左右指针分别向中间移动并判断字符相等。最后判断左大于等于右。O(n), O(1)

    bool IsPalinDrome(const string &str)
    {   if (str.size() == 0) { // (1) 
            return false;
        }
        int start = 0;
        int end = str.size() - 1; // (2)注意这里最好不要用size_t类型. 因为若没写(1), 空串时会整数会反转
        while (start < end && str[start] == str[end]) {
            start++;
            end--;
        }
        return start >= end;
    }

2,reverse:反转字符串并与原串判断串相等。O(n), O(n)需额外空间

3,栈:字符串左半边顺序入栈。之后分别出栈并与右半边判断字符相等。O(n), O(n)需额外空间

二,最长回文子串

leetcode5

1,中心扩展法(暴力枚举)

遍历,以每个元素为中间元素,同时向左右出发找回文串,对每轮找到的更长的回文串记录左右边界,最终使用substr提取子串。

注意:回文串有两种:"aabaa"和"aabbaa",所以每轮的中心点用(i, i)和 (i, i + 1)分别找回文串。CenterExpandValid入参的left,right就是中心点。

class Solution {
public:
    string longestPalindrome(string s)
    {
        int sLength = s.size();
        if (sLength == 0) {
            return "";
        }

        int start = 0;
        int end = 0;
        int maxLen = 0;
        int len = 0;
        string result;
        for (int i = 0; i < sLength; i++) {
            int len1 = CenterExpandValid(s, sLength, i, i);
            int len2 = CenterExpandValid(s, sLength, i, i + 1);
            len = max(len1, len2);
            if (len > maxLen) {
                maxLen = len;
                start = i - (len - 1) / 2;
                end = i + len / 2;
            }
        }
        result = s.substr(start, maxLen);
        return result;
    }
    int  CenterExpandValid(string& s, int sLength, int left, int right)
    {
        while (left >= 0 && right < sLength && s[left] == s[right]) {
            left--;
            right++;
        }
        return right - left - 1;
    }
};

三,分割回文串

leetcode131. 分割回文串

回溯之排列:子串满足某条件:

重点是确定候选集。是通过substr来获取s.substr(start, i - start +1)长度的子串作为候选集的一个元素。

https://blog.csdn.net/u011764940/article/details/105592965

https://blog.csdn.net/u011764940/article/details/105626920

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 背包问题:给定一个背包和一些物品,每个物品有自己的重量和价值,要求在不超过背包容量的情况下,选择最有价值的物品放入背包。 2. 最公共子序列问题:给定两个字符串,求它们的最公共子序列,即两个字符串中都包含的最的子序列。 3. 最递增子序列问题:给定一个序列,求它的最递增子序列,即在原序列中选出一些数,使得它们组成的序列是递增的,并且度最。 4. 最小编辑距离问题:给定两个字符串,求它们之间的最小编辑距离,即通过增删改操作将其中一个字符串转换成另一个字符串所需要的最少操作次数。 5. 最大子段和问题:给定一个序列,求它的最大子段和,即在原序列中选出一段数,使得它们的和最大。 6. 最回文子串问题:给定一个字符串,求它的最回文子串,即在原字符串中找到一个最回文子串。 7. 数字三角形问题:给定一个数字三角形,从顶部出发,在每一层可以选择左下或右下移动一格,求从顶部到底部的最大路径和。 8. 最小路径和问题:给定一个二维网格,每个格子中有一个非负整数,要求从左上角走到右下角,每次只能向右或向下走一步,求最小路径和。 9. 最上升子序列问题(LIS):给定一个序列,求它的最上升子序列,即在原序列中选出一些数,使得它们组成的序列是递增的,并且度最。 10. 分割回文串问题:给定一个字符串,要求将它分割成若干个回文子串,求最小的分割次数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值