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

leetcode热题100--- P5最长回文子串(简易篇),中心扩散法(c)

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

leetcode热题100--- P5最长回文子串(简易篇),中心扩散法(c)

题目:

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

题解:
//函数是用于中心扩散,匹配出符合规则的回文子串 
void extend(char*s, int left, int right, int *length){
    //此处主要是针对两个扩散中心的回文子串
    //超出了字符串长度就直接跳出函数 
	if (right >= strlen(s)){
        return;
    }
	
    while (left >=0 && right length[1] - length[0]){
        length[0] = left;
        length[1] = right;
    }
    return;
}

char * longestPalindrome(char * s){
    
	int length[2] ={0,0};
    //中心扩散法,循环字符串 
	for (int i=0; i 
前置知识 

char *strncpy(char *dest,  const char *src,  size_t n)

  用通俗的话来说:把 src 所指向的字符串复制到 dest,最多可复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填上。

需要注意的是,strncpy 不会自动加上结束符的,需要手动加上,不然会出问题的。

#include
#include
#include 
int main(){
	char string1[13] = "Hello World!";
	
	char* need_c = (char*)malloc(sizeof(string1));
	
	strncpy(need_c, string1, 6);
	printf("%sn",need_c);
	
	strncpy(need_c, string1 + 5, 6);
	printf("%sn",need_c);
	
	free(need_c);
}

:

回文字符串是什么?

            aba、a  诸如此类称为一个扩散中心的回文字符串

            aa、abba 诸如此类称为两个扩散中心的回文字符串

 解题思路

        因为两个扩散中心和一个扩散中心只有略微差异,故可只创建一个函数。

       我们的方法是获得所给字符串中所有的回文子串,并判断哪个是最长的子串。于是可以设计一个能够判断回文子串的函数,这个函数随着遍历所给字符串,找出所有回文子串,并动态辨别哪个是最长的。

        该函数为了区别一个扩散中心和两个扩散中心,设计滑动窗口。当为一个扩散中心时 ,初状态的左右窗口在同一个位置,若为两个扩散中心,则初状态的右窗口会比左窗口多一格。

        在所给字符串遍历结束后,根据得到的数据进行创建。因为最后得到的左、右窗口不是正好对应着相应子串的两端,而是会比最长回文子串左右两端各长一格 。但因为数组下标的特性及字符数组最后需要添加结束符“”,得到的左、右窗口相减正好是所需要创建存储最长回文子串的长度。


   图解

                

(两个扩散中心时,滑动窗口的初始状态)        (滑动中)

 

(一个扩散中心时,滑动窗口的初始状态)                (滑动中)

 

 

 

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015764.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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