Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串中的最小回文数_C++_Algorithm - Fatal编程技术网

C++ 字符串中的最小回文数

C++ 字符串中的最小回文数,c++,algorithm,C++,Algorithm,有人能帮我找到一个解决方案,找到给定字符串可以拆分成的最小回文数吗? 例如: 在我的脑海里,我能想到一个动态规划的解决方案。 M[i,j]-->表示从i开始到j结束的回文。。。如果这样的回文存在则为真,否则为假 M[i,j]=true-iff M[i+1,j-1]==true&&Str[i]==Str[j] 将这些内容存储在由结束索引键控的适当数据结构中,我们可以从以“n”结尾的回文向后遍历此结构,然后在索引处回文结束,在索引处回文开始于以n结尾的前一个回文,依此类推 O(n^2)。不确定是否有

有人能帮我找到一个解决方案,找到给定字符串可以拆分成的最小回文数吗? 例如:


在我的脑海里,我能想到一个动态规划的解决方案。 M[i,j]-->表示从i开始到j结束的回文。。。如果这样的回文存在则为真,否则为假 M[i,j]=true-iff M[i+1,j-1]==true&&Str[i]==Str[j] 将这些内容存储在由结束索引键控的适当数据结构中,我们可以从以“n”结尾的回文向后遍历此结构,然后在索引处回文结束,在索引处回文开始于以n结尾的前一个回文,依此类推


O(n^2)。不确定是否有一种贪婪的分治算法做得更好,

使用递归和动态规划

如果字符串是回文,则结果为1, 否则,将字符串一分为二(必须针对每一对进行此操作),并返回每个部分上两次调用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;
    }
}
#包括
使用名称空间std;
bool ispalind(字符串s1)
{
int s1i=0;
而(s1i
@aix:分区的最小数量(例如每个子字符串都是回文)是我读取它的方式。这个解决方案太慢了。将会有大量的重新计算。这个的运行时间是多少?此外,我认为您可以缓存以前计算的解决方案,以提高效率。
#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;
    }
}