C++代码算法题:(5).最长回文子串

题目及要求:

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

提示:

1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

原创代码:

class Solution {
public:
    string longestPalindrome(string s) 
    {
        int begin=0;//每个当前子串的开头
        int end=0;//每个当前子串的末尾
        int value=0;//判断条件使用。条件一:当形参string s不存在两个及两个以上元素个数的回文字串则value=1,条件二:当形参string s存在两个及两个以上元素个数的回文字串则value=0
        int max=0;//记录历史回文字串的最大元素个数
        string str;//代表当前回文串
        string str_2=s[0];//代表最大回文串
        for(begin=0;begin<=s.size()-1;begin++)
        {
            for(end=begin;end<=s.size()-1;end++)
            {
                value=0;
                /*条件一:当形参string s不存在两个及两个以上元素个数的回文字串则value=1*/
                for(int i=0;i<=(end-begin)/2;i++)
                {
                    if(s[begin+i]!=s[end-i])
                    {
                        value=1;
                        break;
                    }
                }
                /*条件二:当形参string s存在两个及两个以上元素个数的回文字串则value=0*/
                if(value==0)
                {
                    str.erase(0,str.size());
                    for(int i=begin;i<=end;i++)
                    {
                        str.push_back(s[i]);
                    }
                    str_2=str.size()>max?str:str_2;
                    max=str.size()>max?str.size():max;
                    if(str_2.size()==s.size())
                    return str_2;
                }
            }
        }
        return str_2;
    }
};

输出示例:

示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”

代码思路:

首先:
定义变量,并将str_2用s[0]赋初值,用以当形参string s不存在两个及两个以上元素个数的回文字串则输出形参s的首元素

int begin=0;//每个当前子串的开头
int end=0;//每个当前子串的末尾
int value=0;//判断下一个字符是否属于当前子串
int max=0;//记录历史回文子串的最大元素个数
string str;//代表当前回文子串
string str_2=s[0];//代表最大回文子串

其次:
每一个子串(形参s元素s[begin]至s[end]之间的元素)都先判断条件一(当前子串是否存在两个及两个以上元素个数的回文字串)是否满足。若满足条件一,则进行

value=1;
break;

则str_2的值不改变为初值s[0],接下来继续进行循环

end++

如果当前子串(形参s元素s[begin]至s[end]之间的元素)不满足条件一,则由于此时

value=0;

则直接进入条件二来将str(形参s元素s[begin]至s[end]之间的元素)重新赋值(注意str表示当前的回文子串)并通过变量max来判断当前回文子串str与历史最大回文子串str_2的元素进行比较,如果当前回文子串str元素个数比历史最大回文子串str_2的元素个数更大则将历史最大回文子串str_2重新赋值
注意接下来的语句是用来缩小程序运行时间的

if(str_2.size()==s.size())
return str_2;

接下来继续进行循环

end++

最后:
当满足begin>s.size()-1时退出程序,执行

return str_2

反思所得:

在这道题的解题过程中,我开始的时候是不明白回文的定义是什么的,但是经过代码的不断上传和查看他人的讲解,我明白了回文的定义(类似于“上海自来水来自海上”),了解了回文的定义我就重新修改了思路,为了简便算法,我开始考虑将程序分条件编程,并且在每个条件内尽量减少程序进行无用的部分。

LeetCode链接:

https://leetcode-cn.com/problems/longest-palindromic-substring/

  • 46
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 61
    评论
C++ 中找到最长回文子串可以使用动态规划或者中心扩展算法。下面是两种方法的示例代码。 方法一:动态规划 ```cpp #include <iostream> #include <vector> std::string longestPalindrome(std::string s) { int n = s.length(); std::vector<std::vector<bool>> dp(n, std::vector<bool>(n, false)); int start = 0, maxLen = 1; // 初始化长度为1和2的回文子串 for (int i = 0; i < n; ++i) { dp[i][i] = true; if (i < n - 1 && s[i] == s[i + 1]) { dp[i][i + 1] = true; start = i; maxLen = 2; } } // 计算长度大于2的回文子串 for (int len = 3; len <= n; ++len) { for (int i = 0; i <= n - len; ++i) { int j = i + len - 1; if (s[i] == s[j] && dp[i + 1][j - 1]) { dp[i][j] = true; start = i; maxLen = len; } } } return s.substr(start, maxLen); } int main() { std::string s = "babad"; std::cout << longestPalindrome(s) << std::endl; return 0; } ``` 方法二:中心扩展算法 ```cpp #include <iostream> std::string expandAroundCenter(std::string s, int left, int right) { int n = s.length(); while (left >= 0 && right < n && s[left] == s[right]) { --left; ++right; } return s.substr(left + 1, right - left - 1); } std::string longestPalindrome(std::string s) { int start = 0, maxLen = 0; int n = s.length(); for (int i = 0; i < n; ++i) { std::string s1 = expandAroundCenter(s, i, i); std::string s2 = expandAroundCenter(s, i, i + 1); int len1 = s1.length(), len2 = s2.length(); if (len1 > maxLen) { start = i - len1 / 2; maxLen = len1; } if (len2 > maxLen) { start = i - len2 / 2 + 1; maxLen = len2; } } return s.substr(start, maxLen); } int main() { std::string s = "babad"; std::cout << longestPalindrome(s) << std::endl; return 0; } ``` 这两种方法分别使用了动态规划和中心扩展算法来找到最长回文子串。你可以根据实际情况选择其中一种方法来解决问。这些示例代码可以在输入字符串 "babad" 的情况下找到最长回文子串。你可以根据需要修改输入字符串来测试代码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT-菜鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值