leetcode_力扣_5. 最长回文子串

题目描述

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

示例

  • 示例一

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

  • 示例二

输入:s = “cbbd”
输出:“bb”

提示

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

解题思路

  1. 先得到字符串的长度,如果字符串长度为 1,直接返回原字符串,否则继续进行计算;
  2. 题目要求输出符合条件的字符串,因为目标字符串一定是原字符串的子串,所以只需要记录好返回字符串的开始位置以及长度信息即可;
  3. 从第一个字符开始,遍历整个原字符串:
  4. 分析发现返回的字符串长度有奇数和偶数两种情况。所以要对每个位置的字符都要进行两种情况的分析:
    - 若返回结果串的长度为奇数,则它一定关于中间字符对称,此时只需进行简单的判断,并对结果进行处理;
    - 若返回结果串的长度为偶数,可以向前先遍历,只到遍历到与当前字符不同的字符处,后面判断类似于结果长度为奇数时的情况;
  5. 将返回结果用 substr() 从原字符串中拿出并返回。

代码

class Solution {
public:
    string longestPalindrome(string s) {

        int s_len = s.length();

        if(s_len == 1){
        	// 长度为 1,直接返回
            return s;
        }

        int index = 0;
        int ret_start = 0;	// 保存返回串在原串的起始位置
        int ret_len = -1;	// 保存返回串的长度
        int ret_len_temp = 0;	// 每次计算的结果先保存在此变量中,符合条件时再持久化

        while(index < s_len){
        	// 遍历整个字符串

			// 1. 返回结果的长度为奇数
            int i = 1;
            while(index - i > -1 && index + i < s_len && s[index-i] == s[index+i]){
                i++;
            }
            ret_len_temp = (i - 1) * 2 + 1;
            if(ret_len_temp > ret_len){
                ret_len = ret_len_temp;
                ret_start = index - i + 1;
            }

			// 2. 返回结果的长度为偶数
            i = 1;
            while(index + i < s_len && s[index+i] == s[index]){
                i++;
            }
            int j = 1;
            while(index - j > -1 && index + i < s_len && s[index-j] == s[index+i]){
                i++;
                j++;
            }
            ret_len_temp = j + i -1;
            if(ret_len_temp > ret_len){
                ret_len = ret_len_temp;
                ret_start = index - j + 1;
            }

            index++;
        }

		// 截取出返回串并返回
        return s.substr(ret_start, ret_len);
    }
};

结果截图

结果

总结

  • 考察了字符串的相关概念,例如:子串的获取
  • 对“回文”的理解
  • 提高要全面分析问题的意识
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值