求字符串中的最长回文子串

题目:给定一个字符串S,求其中的最长的回文子串!
思路:采用动态规划的思想

/**
* author :wxg
*/
#include<iostream>
#include<string>
using namespace std;

/***
动态规划的思想:字符串 S,以及  f(i,j)表示子字符串 S[i,j] 是否为回文,如果是,f(i,j)=true,否则为  false; 

            ----- true           ,i == j
f (i, j) =  ----  S[i] = S[j]    ,j == i + 1
            ----- S[i]=S[j]&&f(i+1,j-1)   ,j > i + 1

*/

int getLongestPalindromic(string str){
    int max_len=0,start,end;
    const int len=str.size();
    bool f[len][len];
    int i=0,j=0;
    for(i=0;i<len;i++){
        for(j=i;j<len;j++){
            f[i][j]=false;
        }
    }
    for(i=len-1;i>=0;i--){  //注意 i与j的取值,如果 i=0开始,那么f(0,4)就会出错,因为,f(2,3)等中间很多子字符串并没有判断是否为回文
        for(j=i;j<=len-1;j++){
            if(i==j){
                f[i][j]=true;
            }
            else if(j==i+1){
                if(str[i]==str[j]) {
                    f[i][j]=true;
                }
            }else if(j>i+1){
                if(str[i]==str[j]){
                    f[i][j]=f[i+1][j-1];
                }
            }
        }
    }
    for(i=0;i<len;i++){
        for(j=i;j<len;j++){
            if(f[i][j]==true){
                if(j-i+1>max_len){
                    max_len=j-i+1;
                    start=i;end=j;
                }
            }
        }
    }
    cout<<"max_len="<<max_len<<"  start="<<start<<"  end="<<end<<endl;
    cout<<str.substr(start,max_len)<<endl;
    return max_len;
}
int main(){
    string str="wxxgggxg";
    int longest=getLongestPalindromic(str);
    return 0;
}

求字符串中的最长回文子串

时间: 2024-08-06 11:11:49

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

求一个字符串中的最长回文串(Java)

package huiwenchuan; import java.util.Scanner; public class Main { //判断一个字符串是否为回文串 public static boolean isHuiWen(String s) { int len=s.length(); for(int i=0;i<len/2;i++) { if(!(s.charAt(i)==s.charAt(len-i-1))) { return false; } } return true; } /**

查找字符串中的最长回文字符串---Manacher算法

转载:https://www.felix021.com/blog/read.php?2040 首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号.比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#. 为了进一步减少编码的复杂度,可以在字符串的开始和结尾加入另一个特殊字符这样就不用特殊处理越界问题,比如%#a#b#a#@;(如果是C++,字符串末尾有一个\0,故结尾处不需要添加额为的特殊字符@) 然后用一个数组

查找字符串中的最长回文问题评述

class Solution { public: string longestPalindrome(string s) { string post; post.resize(s.size()*2+2); post[0] = '&'; for (int i = 0;i<s.size();i++){ post[2*i + 1] = s[i]; post[2*i + 2] ='#'; } post[s.size()*2] = '#'; post[s.size()*2+1]='$'; cout &l

字符串中的最长回文字符串

“”“ 形如 abba,abaaba正反序相等的字符串称之为回文字符串 题源:领口 ”“” 1.用键值的形式去记录已经存在的字符和其序列 2.遍历原始的字符串 如果字典中没有则存入  如果有 则对其进行回文检测 3.若出现回文字符串,与现在的进行比较 #但是 单单以键值对形式存储 字符和序列  如原始字符串为 ‘abcacbae’ ,和‘abcaddedda’ 这种字符串 那么原先设计的程序就会崩溃 #要找到一个 判别当前字符串的在原字符串中的有效起始位置. kill:通过 键 列表 形式的键值

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

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

[hdu3068 最长回文]Manacher算法,O(N)求最长回文子串

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意:求一个字符串的最长回文子串 思路: 枚举子串的两个端点,根据回文串的定义来判断其是否是回文串并更新答案,复杂度O(N3). 枚举回文串的对称轴i,以及回文半径r,由i和r可确定一个子串,然后暴力判断即可.复杂度O(N2). 在上一步的基础上,改进判断子串是否是回文串的算法.记fi(r)=(bool)以i为对称轴半径为r的子串是回文串,fi(r)的值域为{0, 1},显然fi(r)是关于r

[译]最长回文子串(Longest Palindromic Substring) Part II

[译+改]最长回文子串(Longest Palindromic Substring) Part II 问题:给定字符串S,求S中的最长回文子串. 在上一篇,我们给出了4种算法,其中包括一个O(N2)时间O(1)空间的算法(中心检测法),已经很不错了.本篇将讨论一个O(N)时间O(N)空间的算法,即著名的Manacher算法,并详细说明其时间复杂度为何是O(N). 提示 +BIT祝威+悄悄在此留下版了个权的信息说: 先想想有什么办法能改进中心检测法. 考虑一下最坏的情况.★ 最坏的情况就是各个回文

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

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

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

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