LeetCode.最长回文子串

 昨天因为上课比较忙,所以忘记了每日一题,今天补上。

首先放下题目

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

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

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

提示:

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

 题目看起来非常简单,但是我刚拿到题目不是很有思路,因为想找个时间复杂度更低的办法,首先想到的是滑动窗口,但是想想滑动窗口好像不是很能滑动,参考了一下别人的代码,然后理解了这道题如何解出来。

现在讲讲我的思路,首先得把这个字符串遍历一遍,定义一个index作为遍历时的起始位置,然后再逐渐展开,第一个while先把这个字符right++,判断这两个是否是回文,这一步主要是为了确定left和right的起点,比如abba与aba,abba在index=1时,left=1,在这一次循环里面,right=2,这里成立,所以出了循环之后left=1,right=2,会以这两个为起点开始扩散,判断回文最大数。

第二个循环就是判断这个回文的最大长度了,如果left和right第一次变化没有相等,直接就结束进入下一次,在出了循环之后,count = right-left+1,这里+1是因为数组下标是以0开始,所以得+1,因为最后是以left所在的下标为起点,截取字符串。

这里结束后就是返回一个符合条件的字符串,s.Substring(resuleLeft,max) 的意思是,以resultLeft为起点,往后截取max个字符。 

以下是代码,带了完全注释,请享用~

public class Solution {
    public string LongestPalindrome(string s) {
        int left = 0, right = 0, index = 0, count = 0, max = 0; // 初始化变量
        int resultLeft = 0; // 初始化变量,存储最长回文子串的起始位置
        while(index < s.Length) // 循环遍历整个字符串
        {
            right = left = index; // 初始化左右指针
            // 往右找相同字符
            while(true)
            {
                right++;
                if(right >= s.Length || s[right]!=s[left])
                {
                    right--; // 如果找到不同字符,右指针回退一步
                    break;
                }
            }
            // 左右扩散找回文子串
            while(true)
            {
                right++;
                left--;
                if(left<0 || right>=s.Length || s[left] != s[right])
                {
                    left++; // 如果找到不是回文,左指针回退一步
                    right--;
                    break;
                }
            }
            count = right - left + 1; // 计算当前回文子串的长度
            if(max < count) // 更新最长回文子串的长度和起始位置
            {
                max = count;
                resultLeft = left;
            }
            index++; // 继续遍历下一个字符
        }
        return s.Substring(resultLeft, max); // 返回最长回文子串
    }
}

如果这篇文章对你有帮助,请点个赞收藏一下哦,可以的话再点个关注,以后还会继续创作学习经验! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值