算法分析---查找最大回文子串

将一个字符串倒序后,与原始字符串相同,则该字符串被称之为回文,如今给定一个较长的字符串,要求出该长字符串中包括的最长回文子串。若有多个回文串相同长,找出第一个就可以。

回文串推断算法:

(1)设待推断字符串为str。定义两个整数i和j。i为字符串首元素下标,j为字符串最后一个元素的下标。

(2)推断str[i]是否等于str[j],若不相等则不是回文串,若相等则运行i++,j--。

(3)循环运行(2),直到i==j为止。

寻找最大回文串算法:

(1)用两个整形变量start,stop用来保存最大回文子串的起始位置,用一个整形变量保存最大回文子串的长度maxLen

(2)从字符串的第一个字符開始遍历,依次推断子串是否是回文串,找到第一个回文串后。将起始位置赋给(1)中用来记录起始位置的变量start,stop,并将该回文长度赋给maxLen。

(3)接着遍历字符串,找到回文串后将该回文串长度与maxLen进行比較,若比maxLen大则更新start,stop和maxLen,若不是则继续遍历字符串寻找回文串。

(4)循环运行(3)直到遍历结束。

(5)start,stop相应的字串便是最大回文子串

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

//推断字符串str的子串是否是回文串(子串的在str中的位置由start和stop来确定)
int judgeHuiWen(char *str , int start , int stop){
	while(start < stop){
		if(str[start]!=str[stop]){
			return 0;
		}
		start++;
		stop--;
	}
	return 1;
}

//获取子串的函数
char * getStr(char *str , int start , int stop){
	char *String = (char *)malloc(sizeof(char)*(stop-start+2));  //子串的长度为stop-start+1,但要在末尾补上‘\0‘,所以长度要设为stop-start+2
	int index = 0;
	for(int i = start ; i <=stop ; i++){
		String[index] = str[i];
		index++;
	}
	String[index]=‘\0‘;
	return String;
}
void main(){
	char str[200];
	gets(str);
	int len = strlen(str);
	int maxLen=0; //用来保存回文子串的最大长度
	int start = 0; //保存最大回文子串的起始位置
	int stop = 0; //保存最大回文子串的结束位置
	for(int i = 0 ; i < len ; i++){  //遍历字符串寻找回文子串
		for(int j = i; j < len ; j++){
			if(judgeHuiWen(str , i , j)){
				int Len = j - i + 1;
				if(Len > maxLen){//找到回文子串后就与maxLen进行比較
					maxLen = Len;
					start = i;
					stop = j;
				}
			}
		}
	}
	char *String = getStr(str,start,stop);
	puts(String);
	free(String);
}

算法分析---查找最大回文子串,布布扣,bubuko.com

时间: 2024-10-11 16:06:38

算法分析---查找最大回文子串的相关文章

leetcode 5 :Longest Palindromic Substring 找出最长回文子串

题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 翻译: 找出字符串s中最长的回文子串,字符串s的最长是1000,假设存在唯一的最长回文子串 法一:直接暴力破解 O(N3)的时间复杂度,运行超

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和

参考:http://www.ahathinking.com/archives/124.html 最长公共子序列 1.动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列.如果序列比较长,这种方法需要指数级时间,不切实际. LCS的最优子结构定理:设X={x1,x2,……,xm}和Y={y1,y2,……,yn}为两个序列,并设Z={z1.z2.……,zk}为X和Y的任意一个LCS,则: (1)如果xm=

URAL - 1297 Palindrome(后缀数组求最长回文子串)

Description The "U.S. Robots" HQ has just received a rather alarming anonymous letter. It states that the agent from the competing ?Robots Unlimited? has infiltrated into "U.S. Robotics". ?U.S. Robots? security service would have alrea

Manacher算法求回文子串

这篇文章对Manacher介绍得很详细,而且很容易读懂,原文转自:http://blog.csdn.net/pi9nc/article/details/9251455 一.问题描述 现给定一个已知的字符串str[],现在想要在O(n)的时间复杂度之内求出一个最长的回文子字符串(正着和倒着顺序读一致). Manacher最早发现了可以用O(n)的时间复杂度来解决该问题,所以这种方法称之为Manacher算法. 二.符号说明 回文串包括奇数长的和偶数长的,一般求的时候都要分情况讨论,Manacher

[LeetCode] 5. Longest Palindromic Substring 最长回文子串

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 最长回文子串Longest palindromic substring, 最长回文子串或最长对称因子问题是在一个字符串中查找一个最长连续子串,这个子串

[Manacher]最长回文子串

很久没有写博客了 啪啪啪 写一些东西吧 最长回文子串怎么求呢 首先我们得知道什么是子串,给你一个长长的串,里面任意连续的一段就是它的子串,当然一个字符也是子串 接着什么是回文串呢 不好描述 但是看例子很容易懂:aba 121 1221 1 然后我们有一种很显然的寻找方法 当然是枚举中点 然后尽可能的往外扩大回文串的长度 这种算法花费的时间是N(字符串长度)*Mk(可扩展长度)Mk<N 当然这样的时间并不是很让人满意 于是Manacher这个人发明了一种新算法 他是这样想的 假如我先前已经找到的回

算法练习——最长回文子串

题目: 给定一个字符串 s,找到 s 中最长的回文子串. 示例 1: 输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案. 示例 2: 输入: "cbbd" 输出: "bb" 方法1:暴力求解 思路:可以通从两端到中间遍历字符串,如果碰到字符串是回文串,则该回文串一定是是最长回文串. 效果:判断的整个过程其实有三个内部循环,时间复杂度接近  O(n^3) ,空间复杂度O(n) p

LeetCode 5. 最长回文子串 Longest Palindromic Substring

题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案. 示例 2: 输入: "cbbd" 输出: "bb"  解法一 遍历字符串,以每个字母为中心,向两边扩散查找,记录当前最长的回文子串的长度和起始位置.结尾位置.时间复杂度O(n^2) 注意: ①当剩下的字符串长度小于当前m

最长回文子串 -- 马拉松算法

百度了好长时间,看了很多篇博客才稍微看懂,所以自己写篇博客加深一下映像,并且写的尽量详细一些 希望大家能够只这篇博客就能看懂,能少走些弯路 马拉松算法 1.添加特殊字符 通常情况下,对于一个字符串,需要求解其最长子串时,我们通常需要考虑其字符长度的奇偶性问题,比如'aba'与'abba'的求解方式不太一样,但是马拉松算法在每个字符之间都添加了一个特殊字符(原字符串所没有的),比如'#'或'$'符号,比如'aba'==>'#a#b#a#','abba'==>'#a#b#b#a#',那么此时,无论