有人可以帮我找到解决方案,找到可以分割给定字符串的最小回文数吗? 例如:
abcdef = 6 //the palindromes are (a,b,c,d,e,f)
bbbaxx = 3 //(bbb, a, xx)
level = 1 // (level)
答案 0 :(得分:3)
在我的脑海中,我可以想到一个动态的编程解决方案。 M [I,J] - GT;表示从i开始并在j结束的回文...如果这样的回文存在假,则为真 M [i,j] =真如果M [i + 1,j-1] ==真&& STR [1] == STR [j]的 将这些东西存储在由末端索引键入的适当数据结构中,我们可以从结尾处的回文中向后遍历这个结构,并且在' n'随后回文结束于指数,其中回文开始为前一回文结束于n,依此类推。
为O(n ^ 2)。不确定是否有一个更好的贪婪的分治算法,
答案 1 :(得分:3)
使用动态编程的递归
如果字符串是回文,则结果为1, 否则你将你的字符串拆分为2(必须在每一对中进行)并返回每个部分上两次调用minPalinCount的最小总和。
在伪代码中你有这样的东西
minPalinCount(s)
s is a palindrome ?
return 1
else
for each position in s
s1,s2 = s split in 2 at this position
count = min(minPalinCount(s1) + minPalinCount(s2), count)
return count
在c ++中
#include <algorithm>
using namespace std;
bool ispalind(string s1)
{
int s1i = 0;
while (s1i < s1.size())
{
if (s1[s1i] != s1[s1.size() - 1 - s1i ])
return false;
s1i++;
}
return true;
}
int palindromeCount(string a)
{
if (ispalind(a))
return 1;
else
{
int min = a.size();
for (int i = 1; i < a.size() ; i++)
min = std::min(palindromeCount(a.substr(0, i)) + palindromeCount(a.substr(i, a.size() - i)), min);
return min;
}
}