#include 赞 踩 Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。
最小回文串记录
// 最小回文串.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
string s;
const int maxn = 1005;
int temp[maxn][maxn];
int d[maxn];
/*
bool pre_slove(int i, int j, string s)
{
string stemp = s.substr(i, j-i+1);
int mid = (i + j) / 2;
if (stemp.size()%2==0)
{
int mid1 = mid;
int mid2 = mid + 1;
string s1 = s.substr(mid2,mid+1);
reverse(s1.begin(), s1.end());
if (s.substr(0, mid1+1) == s1)
return true;
else return false;
}
else
{
string s1 = s.substr(mid + 1,mid);
reverse(s1.begin(), s1.end());
if (s.substr(0, mid) == s1)
{
return true;
}
else
{
return false;
}
}
}*/
//该函数为判断字符是否为回文必备,请记住
int judge(string s)
{
int i, ls;
int flag = 1;
ls = s.length();
for (i = 0;i < ls / 2;i++)
{
if (s[i] != s[ls - 1 - i])
{
flag = 0;
break;
}
}
return flag;
}
int main()
{
int n;
cin >> n;
while (n--)
{
cin >> s;
for (int i = 0;i < s.size();i++)
{//下面一小段代码用以记录从i到j的字符串是否为回文
for (int j = i;j < s.size();j++)
{
if (i == j)
{
temp[i][j] = 1;
continue;
}
if (judge(s.substr(i,j-i+1)))
{
temp[i][j] = 1;
}
else
{
temp[i][j] = 0;
}
}
}
memset(d, 10000, sizeof(d));
for (int i = 0;i < s.size();i++)
{
d[i] = i + 1;//为什么这个d的值初始化为一个比较大的数,因为我们假设的d[i]是以i为结尾的最少的回文串,刚开始当然以最多的来计算
for (int j = i;j >= 0;j--)
{
if (j == 0)
{//因为该动态规划算法是以上一层所计算的来进行优化的,如果你把j从0到i的话,你在优化过程中所得到的量将不是上一次所得到的量
//而是这一次所得到的优化量,所以是错误的
if (temp[j][i])
{
d[i] = 1;
}
}
else if (temp[j][i])
{
d[i] = min(d[i], d[j-1] + 1);
}
}
}
cout << d[s.size()-1] << endl;
}
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件