栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leetcode 笔记No.5

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode 笔记No.5

leetcode No.5 最长回文子串

自己只会暴力破解,贴两个题解的代码,当作整理

三个指针,一个左移的指针,一个右移指针,一个中心指针一直右移
1、初始化 r = l = index
2、把index和r+1的位置进行比较如果相等,则把r++,同时中心指针也右移 //如abbbbc的情况
3、无法再右移了,则进行由中心像两侧扩展,l-1,r+1进行对比判断,知道不成立为止。
4、记录最大值对应的起始地址和大小。

char * longestPalindrome(char * s){
    int len = 0;
    int index = 0;
    int maxLen = 1;
    int start = 0;
    int left, right;
    char *str = NULL;

    len = strlen(s);
    while(index < len - 1) 
    {
        right = left = index;
        while(s[right + 1] == s[index++]) 
        {
            if (++right == len - 1)
            {
                break;
            }
        }
        while ((left > 0) && (left < len - 1) && (s[left - 1] == s[right + 1]))
        {
            left--;
            right++;
        }
        if (right - left + 1 > maxLen)
        {
            maxLen = right - left + 1;
            start = left;
        }
    }
    str = malloc(maxLen + 1);
    strncpy(str, s + start, maxLen);
    str[maxLen] = '';

    return str;
}
har * longestPalindrome(char * s){
    ///  默认最大回文串是第一个字符组成的长度为1的回文串
    ///  长度不超过1k,所以用16位储存即可。
    int16_t maxStart = 0, maxSize = 1; 
    int16_t s_len;
    int16_t start = 0, size = 2, left, right, i;

    for(s_len = 0;s[s_len];s_len++); ///< 计算长度
    if(s_len == 1) return s; ///< 长度为1则直接返回原字符串

    ///  start作为最长回文字符的中心,显然如果当前记录的最长回文为
    ///  maxSize位,那么第(s_len - (maxSize+1)/2 - 1)后的所有位都不可能
    ///  存在更长的回文.
    for(;start < (s_len - (maxSize+1)/2);start++)
    {
        ///  只检测比记录中更长的回文。
        ///  最简单的,尝试以start为中心,判断比记录长度多1或者2的回文需
        ///  要满足条件。
        ///  多2的条件下,左右指针的设置
        left = start - (maxSize + 1) / 2;
        right = start + maxSize / 2 + 1;
        if(left>=0&&s[right]==s[left]) ///< 验证最外层是否满足回文条件
        {
            ///  如果满足,检查内部是否满足条件
            for(left++, right--;s[right]==s[left]&&left=right)
            {
                maxStart = start - (maxSize+1) / 2;
                maxSize += 2;
                left = maxStart - 1;
                right = maxStart + maxSize;
                while(left>=0&&right=0&&s[right]==s[left]) ///< 验证最外层是否满足回文条件
        {
            ///  如果满足,检查内部是否满足条件
            for(left++, right--;s[right]==s[left]&&left=right)
            {
                maxStart = start - maxSize/2;
                maxSize += 1;
                left = maxStart - 1;
                right = maxStart + maxSize;
                while(left>=0&&right
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769149.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号