zoukankan      html  css  js  c++  java
  • LeetCode-5-最长回文子串

    题目

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

    示例 1:

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

    示例 2:

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

    思路

    这道题我自己没有什么很好的思路,于是腆着脸取看了官方的解题思路,链接如下:

    https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode/

    代码

    这里我采用了方法三,使用func函数实现给定对给定的i,j找到最长回文串P(i,j)的长度。

    然后在longestPalindrome函数中遍历该字符串,以每个字符为中心或二元中心调用func获取最长回文串的长度。

    最后选取最长的回文串,并将之后字符串的截断并返回。

    代码如下:

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

    int func(int i, int j, char *s)
    {
    int len = strlen(s);

    // 超出边界判断
    if (i-1 < 0 || j+1 == len)
    {
    return (j-i+1);
    }

    // 不相等判断
    if (s[i-1] != s[j+1])
    {
    return (j-i+1);
    }
    else
    {
    return func(i-1, j+1, s);
    }
    }


    char * longestPalindrome(char * s){
    int begin = -1, max = -1;
       int len = strlen(s);
       int half = 0, tmp = 0;
       int i = 0;
       
       
       if (len == 0 || len == 1)
      {
      return s;
      }
       
       // 遍历该字符串
       for (i=0; i<len-1; i++)
      {
    tmp = func(i, i, s);
    if(tmp > max)
    {
    half = tmp / 2;
    max = tmp;
    begin = i - half;
    }
    if (s[i] == s[i+1])
    {
    tmp = func(i, i+1, s);
    if (tmp > max)
    {
    half = tmp / 2;
    max = tmp;
    begin = i - half + 1;
    }
    }
      }
       // 截断字符串
       s[begin+max] = '';
       
       return (s+begin);
    }



  • 相关阅读:
    三星t5拆解
    一条 SQL 引发的事故,同事直接被开除!!
    Git 不能提交空目录?我也是醉了!
    Redis 6.0.8 紧急发布,请尽快升级!
    String.format() 图文详解,写得非常好!
    为什么 Redis 要比 Memcached 更火?
    Lambda 表达式入门,这篇够了!
    天啊,为什么我的 Redis 变慢了。。
    写出一手烂代码的 19 条准则!
    Redis 面试一定要知道的 3 个 问题!
  • 原文地址:https://www.cnblogs.com/sakurapiggy/p/12562986.html
Copyright © 2011-2022 走看看