最长回文(通过比较原字符串和其翻转字符串)

// zuichanghuiwen.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<string>
#include<stack>
using namespace std;

void palindrome(string str)
{
	stack<char> sta;                           //翻转字符串
	for (int i = 1; i < str.length(); i++)
		sta.push(str[i]);
	string str2(str.length(),'');
	for (int i = 1; i < str.length(); i++)
	{
		str2[i] = sta.top();
		sta.pop();
	}

	int m = str.length()-1;               //求愿字符串与翻转字符串的最长公共子序列
	int n = str2.length()-1;
	int c[20][20];
	for (int i = 1; i <= m; i++)
		c[i][0] = 0;
	for (int j = 0; j <= n; j++)
		c[0][j] = 0;
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
			if (str[i] == str2[j]) {
				c[i][j] = c[i - 1][j - 1]+1;
			}
			else
				c[i][j] = 0;

	int max = 0, maxi = 0,maxj=0;                             //重建最大子序列
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
			if (c[i][j] > max) {
				max = c[i][j];
				maxi = i;
				maxj = j;
			}
	for (int i = maxi - max + 1; i<= maxi; i++)
		cout << str[i];
}
int main()
{
	string str("adhjgasddsa");
	palindrome(str);
	while (1);
    return 0;
}

  

原文地址:https://www.cnblogs.com/linear/p/6638149.html