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);
    }



  • 相关阅读:
    单链表的基本操作--c++
    剑指Offer-- 替换空格
    华为机试题-字符串分隔
    Leetcode 98. Validate Binary Search Tree
    树的层次遍历的几种方法
    Camera Path插件的使用
    3d 人物残像
    gameUnity 0.15 beta 网络游戏框架
    gameUnity 0.15alpha 网络游戏框架
    gameUnity 网络游戏框架
  • 原文地址:https://www.cnblogs.com/sakurapiggy/p/12562986.html
Copyright © 2011-2022 走看看