学渣带你刷Leetcode-0005.最长回文子串

题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

白话题目:

给了我们一个字符串,找到里面的子串,对!还是子串,不是子序列。

凹,忘了,啥是回文-----“斗鸡山上山鸡斗;龙隐洞中洞隐龙。”,小时候玩过正话反说没,就是反说和正说一样。

算法:

不要被白话题目的说法带偏了,有个思想就是。

(1)逐个字符找以它为中心的回文串,左边 ← 中心  →_→ 右边

(2)特殊情况可以优化的是中心的概念是广义的,拥有相同元素的时候是可以扩大的。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

C语言完成代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * longestPalindrome(char * s)
{
    int right = 0, left = 0, count = 0;
    int startidx = 0;
    int max_len = 0;
    int i=0;
    for ( i = 0; s[i] != '\0'; i += count)
    {
        count = 1;
        left = i - 1;
        right = i + 1;

        while ((s[right]!='\0') && (s[i] == s[right]))   // 选出重复字符
        {
            right++;
            count++;
        }

        while ((left >= 0) && (s[right]!='\0') && (s[left] == s[right]))   // 由中心字符向左右扩展
        {
            left--;
            right++;
        }

        if (max_len < (right - left - 1))
        {
            max_len = right - left - 1;  // 左右标记不在回文子串范围内,在外面两侧,需要减1
            startidx = left + 1;
        }
    }


    s[startidx + max_len] = '\0';
    return s + startidx;



}

int main()
{
    printf("可以输入的测试数据 babad 或者 cbbd\n");
    char  *s;
    s=(char *)malloc(sizeof(char));
    //scanf("%s",s);  //处理不了空格
    gets(s);

    char *result=longestPalindrome(s);

    printf("%s\n",result);
}
发布了15 篇原创文章 · 获赞 1 · 访问量 1249

猜你喜欢

转载自blog.csdn.net/qq_39729096/article/details/105211059