15-2求最大回文的长度

  1. #ifndef PALINDROME_H_
  2. #define PALINDROME_H_
  3. #include<iostream>
  4. #include<string>
  5. int palindrome_longest(char *str,int front,int back);
  6. #endif
  1. #include"Palindrome.h"
  2. #define Max(a,b) a>b? a:b
  3. int palindrome_longest(char *str,int front,int back){
  4. int pali_count=0;
  5. if(front==back)
  6. return pali_count+1;
  7. if(str[front]==str[back]){
  8. pali_count=palindrome_longest(str,front+1,back-1)+1;
  9. }else{
  10. pali_count=Max(palindrome_longest(str,front+1,back),palindrome_longest(str,front,back-1));
  11. }
  12. return pali_count;
  13. }
  1. #include "LongPath.h"
  2. #include "Palindrome.h"
  3. int main(){
  4. char *str="civic";
  5. char *str0="racecar";
  6. char *str1="character";
  7. std::cout<<palindrome_longest(str,0,4)<<std::endl;
  8. std::cout<<palindrome_longest(str0,0,6)<<std::endl;
  9. std::cout<<palindrome_longest(str1,0,8)<<std::endl

在上面的算法中,我们采用了求最长公共子序列一样的算法,也就是《算法导论》第三版 15-4节。

其思想很值得借鉴。对于处理这些“非正规”的子符串问题很有启发性,对于最长公共子序列,并

不是我们以前志熟悉的那种连续性的最长公共子序列,而是求不要求连续性的公共子序列,于是知

我们不能从两个子序列都开始缩进或者退避。

这就是这些问题的特点。

对于这个问题的回文是,我们采用类似的思想,如果相等,那好,他们回文的长度加1,如果不相等,那

只有其中的一端要牺牲一下啦,它要退回一个字符,然后求这两个的最长的那个就行了。

  1. if(str[front]==str[back]){
  2. pali_count=palindrome_longest(str,front+1,back-1)+1;
  3. }else{
  4. pali_count=Max(palindrome_longest(str,front+1,back),palindrome_longest(str,front,back-1));
  5. }

以上就是核心的代码。永远只牺牲一端。不会同时退避两端。

来自为知笔记(Wiz)

时间: 2024-12-26 22:51:32

15-2求最大回文的长度的相关文章

UVa 11404 回文子序列(LCS求最长回文串长度)

https://vjudge.net/problem/UVA-11404 题意: 给定一个由小写字母组成的字符串,删除其中的0个或多个字符,使得剩下的字母(顺序不变)组成一个尽量长的回文串.如果有多解,输出字典序最小的解. 思路: 首先,最长回文子串的长度可以通过正序字符串和逆序字符串进行LCS得出. 但是这道题目麻烦的是还要输出这个回文串,并且字典序得最小. 应用的主要还是LCS的思想方法,不过在进行状态转移的时候,再加上字符串的状态转移. 不过最后得到的字符串不一定是回文串,但是它的前一半肯

hdu3613 Best Reward 扩展kmp or O(n)求最大回文子串

/** 题目:hdu3613 Best Reward 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题意:有一个字符串,把他切成两部分. 如果这部分是回文串,那么他的值为所有字母的权值和.否则这部分值为0:这两部分的值和为该切法的权值. 求最大的切法的权值. 思路: 如果能够判断[0,i],[i,n-1]是一个回文串(0<=i<n)那么就可以枚举i,计算切割位置为i时候两部分的贡献和. 取最大的. 利用O(n)的算法求最长回文子串的做法获得

转:Manacher算法----O(n)时间求最大回文子串

O(n)回文子串(Manacher)算法 转自:http://www.cnblogs.com/biyeymyhjob/archive/2012/10/04/2711527.html 资料来源网络 参见:http://www.felix021.com/blog/read.php?2040 问题描述: 输入一个字符串,求出其中最大的回文子串.子串的含义是:在原串中连续出现的字符串片段.回文的含义是:正着看和倒着看相同,如abba和yyxyy. 解析: 这里介绍O(n)回文子串(Manacher)算法

URAL 1297. Palindrome(后缀数组求最大回文串)

题目大意:给你一串字符串,让你求出来它存在的最长连续的回文串. 解题思路:先把字符串逆序加到数组中,然后用后缀数组求解.两种方法:1,枚举排名,直接比较rank相同的字符串的位置差是不是len.如果是的话,就记录求解:2,枚举地址,求第i地址与第2*len-i+1的lcp的最大值. PS:需要注意如果多解输出靠前的字符串. 两种写法写在了一起,分别是Del,和Del1函数. 1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB T

马拉车——最长回文子串长度、回文串个数

题目链接 模板 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=3e5+5; 4 5 char s[maxn],str[maxn]; 6 int l1,l2,p[maxn],ans; 7 8 void init() 9 { 10 str[0]='$'; 11 str[1]='#'; 12 for(int i=0;i<l1;i++) 13 { 14 str[i*2+2]=s[i]; 15 str[i*2+3

Manacher算法解决最长回文子串长度问题

马拉车(Manacher)算法(具体算法流程看这个哥们的:https://blog.csdn.net/qq_35065720/article/details/104205920): 算法解决:在一个字符串中找到最长的回文字符串. 实现策略: 以每个位置作为中心,向两边扩展,可以确定奇回文,但是偶回文无法这样做. 解决方法:在字符串中间及两边插入某种字符,此时可以按照这种方法进行扩展.此时无论奇回文还是偶回文都可以找到. 例如11211,此时添加任意字符在两边#1#1#2#1#1#此时均可以进行回

hdu 1544 求字符串回文

#include <stdio.h> #include <string.h> int pal(char *str) { int len = strlen(str); int l, r; int ans = len; for(int i=0; i<len; i++) { l = i-1; r = i+1; while(l >= 0 && r < len && str[l] == str[r]) {l--; r++; ans++;} l

求最长回文子串——Manacher算法

回文串包括奇数长的和偶数长的,一般求的时候都要分情况讨论,这个算法做了个简单的处理把奇偶情况统一了.算法的基本思路是这样的,把原串每个字符中间用一个串中没出现过的字符分隔开来(统一奇偶),用一个数组p[ i ]记录以 str[ i ] 为中间字符的回文串向右能匹配的长度.先看个例子 原串:       w  a   a   b   w   s   w   f   d 新串(str):  #   w  #   a   #   a   #   b  #   w   #   s    #   w   

manacherO(n)求最长回文子串 hihocoder1032

原文地址:https://segmentfault.com/a/1190000003914228   http://blog.csdn.net/synapse7/article/details/18908413 灰常不错的学习资料 先预处理下:在每个字符的两边都插入一个特殊的符号,比如abba变成#a#b#b#a#,aba变成 #a#b#a#(因为Manacher算法只能处理奇数长度的字符串).同时,为了避免数组越界,在字符串开头添加另一特殊符号,比如$#a#b#a#. 以字符串32123432