首页 > 其他分享 >力扣——5.最长回文子串(c语言)

力扣——5.最长回文子串(c语言)

时间:2023-04-22 13:45:31浏览次数:39  
标签:子串 char 力扣 result 长度 1000 回文

题目描述:

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

示例1:

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

示例2:

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

1、思路1:动态规划

对于一个子串而言,如果它是回文子串,并且长度大于2,那么将它首尾两个字母去掉以后,它仍然是个回文串。

那么我们就可以写出动态规划的状态转移方程:
$$
P(i,j) = P(i+1, j-1)&(S_i==S_j)
$$
也就是说,只有s[i+1 : j-1]是回文串,并且s的第i个字母和第j个字母相同时,s[i : j]才会是回文串。

以上所有的讨论是建立在子串长度大于2的前提上的,我们还要考虑动态规划的边界条件,即子串长度为1或2。对于长度为1的子串,它显然是个回文串;对于长度为2的子串,只要它的两个字母相同,它就是一个回文串。

因此,我们可以写出动态规划的边界条件:
$$
\begin{cases}
P(i,i) = true \
P(i,i+1) = (S_i == S_{i+1})
\end{cases}
$$
注意:在状态转移方程中,我们是从长度较短的字符串向长度较长的字符串进行转移的,因此一定要注意动态规划的循环顺序。

代码如下:

char * longestPalindrome(char * s){
    int len = strlen(s);
    int dp[1000][1000];
    char result[10001] = {0};
    int l,i,j;
    for(l=0; l<len; ++l)
    {
        for(i=0; i+l<len; ++i)
        {
            j = i+l;
            if(0 == l){
                dp[i][j] = 1;
            } else if(1 == l){
                dp[i][j] = (s[i]==s[j]);
            } else{
                dp[i][j] = (s[i]==s[j] && dp[i+1][j-1]);
            }
            if(dp[i][j] && l+1>strlen(result)){
                strncpy(result, s+i, l+1);
                result[l+1] = '\0';
            }
        }
    }
    char *ret = result;
    return ret;
}

标签:子串,char,力扣,result,长度,1000,回文
From: https://www.cnblogs.com/blue-Suri/p/17342914.html

相关文章

  • 用C#写一个上传下载文件至OSS后返回文件路径用DES加密解密
    废话不多说,直接上代码:usingAliyun.OSS;//引入阿里云OSSSDKusingSystem;usingSystem.IO;usingSystem.Security.Cryptography;//引入.NETFramework中的加密库usingSystem.Text;publicclassOSSHelper{///<summary>///将文件上传至OSS,并使用D......
  • 力扣 406. 根据身高重建队列
    406.根据身高重建队列假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i]=[hi,ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示......
  • 4/21 力扣 82. 删除排序链表中的重复元素 II
    给定一个已排序的链表的头 head, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回已排序的链表 。 示例1:输入:head=[1,2,3,3,4,4,5]输出:[1,2,5]示例2:输入:head=[1,1,1,2,3]输出:[2,3] 提示:链表中节点数目在范围[0,300]内-100<=Node.val<=100题目......
  • leetcode-234回文链表
    回文链表方法一:借助数组进行判断把节点的值复制到一个数组中再利用数组进行判断,但是这样需要占用额外的空间/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*......
  • 最长公共子串
    最长公共子串给定两个字符串,求这两个字符串的不包含数字的最长公共子串的长度。输入格式共两行,每行一个由小写字母和数字构成的字符串。输出格式一个整数,表示给定两个字符串的不包含数字的最长公共子串的长度。如果不存在满足要求的非空公共子串,则输出$0$。数据范围输入......
  • 4/20 C语言判断字符串是否为回文,字符串中可以包含中文和英文
    //已知中文字符占用两个字节#include<stdio.h>#include<string.h>booljudge(char*a,int&i,int&k);intmain(){inti,k;chara[100];while(scanf("%s",a)!=EOF){i=0;k=strlen(a)-1;while......
  • LeetCode Top100:回文链表 (python)
    LeetCodeTop100:回文链表给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,105] 内0<=Node.val<=9 ......
  • 【DP】LeetCode 132. 分割回文串 II
    题目链接132.分割回文串II思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums[i]为结尾的状态;dp[i][j]分别表示以nums1[i]和nums2[j]为结尾的状态,以此类......
  • 力扣题解分享1043.分割数组以得到最大和
    1043.分隔数组以得到最大和题目描述给定一个整数数组arr和一个整数k,将该数组分隔为长度最多为k的一些连续子数组。分隔完成后,每个子数组中的所有值都会变为该子数组中的最大值。返回将数组分隔变换后能够得到的元素最大和。示例input:arr=[1,15,7,9,2,5,10]k=......
  • #yyds干货盘点# LeetCode程序员面试金典:串联所有单词的子串
    题目:给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串长度相同。 s 中的串联子串是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。例如,如果 words=["ab","cd","ef"],那么 "abcdef", "abefcd","cdabef", "cdefab","efabcd",......