• 力扣:5-最长回文子串


    题目描述

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

    示例 1:

    输入:s = "babad"
    输出:"bab"
    解释:"aba" 同样是符合题意的答案。


    示例 2:

    输入:s = "cbbd"
    输出:"bb"
     

    提示:

    1 <= s.length <= 1000
    s 仅由数字和英文字母组成

    来源:力扣(LeetCode)

    解题思路

    首先我们要知道什么是回文子串,回文子串就是指正读和反读都一样的字符串。比如moom,level,civic等都是回文字符串。不难得出回文串分为两种,一种是围绕中间一个字符对称比如level,一种是围绕中间两个字符对称比如moom。所以我们的思路就是由中间向两边扩散,遍历到两边不一样时停止查询,返回这个回文串的长度。这个也叫中心扩展法。

    需要注意的是要查询两种回文串的长度,容易遗漏两个字符为中心的回文串

    这个用暴力做法的话会超时,一般这种题目用暴力是做不出来,所以我们就要观察,找规律,去优化。

    这道题还有一个解法是利用动态规划,但是我对动态规划掌握的还不是特别熟练,所以这里就不用动态规划去做这道题,感兴趣的可以相关的题解

    代码实现

    1. class Solution {
    2. public:
    3. string longestPalindrome(string s) {
    4. int res=s.size();
    5. int l,r;//用来记录最长回文串的左右边界
    6. int ans=0;//记录最长回文串的长度
    7. for(int i=0;i
    8. {
    9. int ans1=Find(s,i,i);//获得一个字符为中心的回文串长度
    10. int ans2=Find(s,i,i+1);//获得两个字符为中心的回文串长度
    11. //第一种更新回文串
    12. if(ans1>ans)
    13. {
    14. l=i-(ans1-1)/2;
    15. r=i+(ans1-1)/2;
    16. ans=ans1;
    17. }
    18. //第二种更新回文串
    19. if(ans2>ans)
    20. {
    21. l=i-(ans2-2)/2;
    22. r=i-(ans2-2)/2;
    23. ans=ans2;
    24. }
    25. }
    26. return s.substr(l,ans);//这里返回l开头,长度为ans的字符串
    27. }
    28. int Find(string s,int l,int r)
    29. {
    30. while(l>=0&&rsize()&&s[l]==s[r])
    31. {
    32. l--;
    33. r++;
    34. }
    35. return r-l-1;
    36. }
    37. };
  • 相关阅读:
    Oracle生成AWR报告
    基于python的毕业设计学生兼职平台
    作为思摩尔应对气候变化紧急事件的一项举措,FEELM加入碳披露项目
    设计模式单例模式
    Linux下C/C++链接mysql流程
    Nginx Rewrite
    Chromium Mojo通信
    MySQL进阶实战5,为什么查询速度会慢
    Gradle基础
    [附源码]计算机毕业设计农产品销售网站Springboot程序
  • 原文地址:https://blog.csdn.net/qq_52905520/article/details/126472882