求给定字符串中最长回文子串

5. Longest Palindromic Substring

这个是在本机测试,然后一次点亮的,嘻嘻

  1 char* longestPalindrome(char* s) {
  2     char *p = s;                /* first char */
  3     char *left, *right;         /* store the pointer of longest palindrome string */
  4     int max = 0;                /* store max length */
  5     while(*p != ‘\0‘) {
  6         char *l = p;
  7         char *r = p;
  8         int count = 0;
  9         while(1) {
 10             if(*l == *r) {
 11                 if(p==l)
 12                     count += 1;
 13                 else
 14                     count += 2;
 15                 if(l == s || *(r+1) == ‘\0‘) {
 16                     if(max < count) {
 17                         max = count;
 18                         left = l;
 19                         right = r;
 20                     }
 21                     break;
 22                 }
 23                 l--;
 24                 r++;
 25             } else {
 26                 if(max < count) {
 27                     max = count;
 28                     left = ++l;
 29                     right = --r;
 30                 }
 31                 break;
 32             }
 33         }
 34         p++;
 35     }
 36
 37     p = s;
 38     while( *(p+1) != ‘\0‘) {
 39
 40         int count = 0;
 41         if(*p == *(p+1)) {
 42             char *l = p;
 43             char *r = p+1;
 44             count = 2;
 45             while(1) {
 46
 47                 if(*l == *r) {
 48                     if(l != p)
 49                         count += 2;
 50
 51                     if(l==s || *(r+1) == ‘\0‘) {
 52                         if(max < count) {
 53                             max = count;
 54                             left = l;
 55                             right = r;
 56                         }
 57                         break;
 58                     }
 59                     l--;
 60                     r++;
 61                 } else {
 62                     if(max < count) {
 63                         max = count;
 64                         left = ++l;
 65                         right = --r;
 66                     }
 67                     break;
 68                 }
 69             }
 70         }
 71         p++;
 72     }
 73
 74     for(p=left; p<=right; p++)
 75         printf("%c", *p);
 76     *(right+1) = ‘\0‘;
 77     return left;
 78 }
时间: 2024-11-05 18:32:45

求给定字符串中最长回文子串的相关文章

hdu3068 求一个字符串中最长回文字符串的长度 Manacher算法

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 31611    Accepted Submission(s): 11618 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?" 小Ho奇怪的问道:"什么叫做最长回文子串呢?" 小Hi回答道:"一个字符串中连续的一

计算字符串的最长回文子串 :Manacher算法介绍

在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简单来说就是正着读和反着读都是一样的字符串,比如abba,noon等等,一个字符串的最长回文子串即为这个字符串的子串中,是回文串的最长的那个. 计 算字符串的最长回文字串最简单的算法就是枚举该字符串的每一个子串,并且判断这个子串是否为回文串,这个算法的时间复杂度为O(n^3)的,显然无法令人 满意,稍微优化的一个算法是枚举回文串的中点,这里要分为两种情况,一种是回文串长度是奇数的情况,另一种是回文串长度是偶数的情况,枚举中点再判断是否 是回文

【回文字符串】 最长回文子串O(N) Manacher算法

原理讲的清晰:Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串 注意: ①动态生命P[]和newStr数组后,不要忘记delete[] //其实这是基本的编码习惯 ②最终返回结果是P[i]-1 下面是自己写的Manacher函数 int manacher(char *src){ int srcLen=strlen(src); int len=2*srcLen+2; char *newStr=new char[len];//还是+3??要不要给\0留个位置??不用 i

LeetCode之“字符串”:最长回文子串

题目要求: 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串.例如,给出字符串 "abcdzdcab",它的最长回文子串为 "cdzdc". 解答: 这个题目的一个简单的解法就是对字符串中的每一个字符,同时向其两边延展,以找到最长回文子串.这种方法是可以的,但要处理回文子串长度为奇数和偶数的两种情况是比较麻烦的.如下图的几个字符串: “a” "aa" "aaa" "

Manarcher 求 字符串 的最长回文子串 【记录】

声明:这里只写出了实现过程.想学习Manacher的可以看下这里给出的实现过程,算法涉及的一些原理推荐个博客. 感觉讲的很细 引子:给定一个字符串s,让你求出最长的回文子串的长度. 算法大致实现过程: 一:为了排除回文字符串长度奇或偶的影响.先在每两个字符之间插入一个原字符串没有出现过的字符(这里就用#)构成新串str.设p[i] 为以str[i]字符为中心的回文字符串的最大半径.则新串中以str[i]为中心的回文串长度为p[i]-1. 二:字符串从前到后求p[]数组.(不要问为什么从前到后)

(字符串) Manacher 最长回文子串。

最长回文子串就是一个字符串的一个子串,他从左往右读和从右往左读是一样的. 可以用 Manacher 算法来求,他的复杂度是 O(n) . 可以看这篇文章 http://blog.csdn.net/ywhorizen/article/details/6629268 但是其中应该有一个错误(纠结了我一天...) 就是 这一句,文章里面是说当 Mx-i <= Mp[j] 的时候就要用到,因为后面的还没比较. 但是如图,蓝色的部分是相等的,如果红色的等于蓝色的话,那么Mx就不可能是这个值,所以红色的一定

C++求一个字符串中的所有回文字符串并且输出结果(字符串操作)

#include <iostream> #include <string.h> using namespace std; bool check(char *str)//判断这是不是一个回文字符串. { int i = 0; int j = strlen(str)-1; while(i<j) { if(*(str+i)!=*(str+j)) return false; i++; j--; } return true; } void get_str(char *str) { in

字符串中最长回文,最笨的解法

回文:aba abcba 双重循环遍历字符串,外层从第一个开始找,内层循环从最后一个开始找.当外层的字符和内存循环的字符相等时则组成新的数组,判断是否是回文 public static void main(String[] args) { String str = "gcgdecdabcdefgfeh"; char[] chars = str.toCharArray(); Map<String,Integer> maxLength = maxLength(chars); S