题目描述
有一个长度为n的字符串,这个字符串由26个小写字母组成.
对这个字符串进行多次操作,每次操作可以把该字符串中一段连续的回文子串删除(单个字符也属于回文串),删除后剩下的串会拼在一起.
请问最少需要多少次操作可以将这个字符串删光.
输入描述
第一行,包含一个正整数T(1≤T≤20)代表测试数据的组数.
对于每组测试数据,仅有一行,代表这个字符串.(1≤n≤ 500)
输出描述
对于每组数据输出一行整数,代表在进行最少多少次操作后,可以将这个字符串删光.
输入
3
mwapd
tvuvv
yxxml
输出
5
3
4
代码
#include <iostream>
#include <string>
using namespace std;
int fun(int c,string s)
{
if (s == "")
{
return c;
}
string ss = "";
int ll=0, rr=0;
for (int i = 0; i < s.length(); ++i)
{
int l = i - 1, r = i + 1;
if (l >= 0 && r < s.length() && s[l] == s[r])
{
l--;
r++;
}
if (ss.length() < r - l - 1)
{
ss = s.substr(l + 1, r - l - 1);
ll = l;
rr = r;
}
l = i, r = i + 1;
if (l >= 0 && r < s.length() && s[l] == s[r])
{
l--;
r++;
}
if (ss.length() < r - l - 1)
{
ss = s.substr(l + 1, r - l - 1);
ll = l;
rr = r;
}
}
string sss = s.substr(0, ll+1) + s.substr(rr);
return fun(c+1, sss);
}
int main()
{
int n;
cin >> n;
while (n--)
{
string s;
cin >> s;
cout << fun(0, s) << endl;
}
return 0;
}