String 算法:将字符串最优地拆分为3个子字符串

String 算法:将字符串最优地拆分为3个子字符串,string,algorithm,substring,String,Algorithm,Substring,一段时间以来,我一直在试图解决这个看似非常简单的问题。给定一个字符串k,我们必须找到最佳方法将该字符串k拆分为3个子字符串k1,k2,k3,比如k1+k2+k3=k。拆分是最优的,当且仅当通过反转每个子字符串并将它们重新连接在一起,我们可以得到尽可能最小的词典结果 例如,以字符串k=“anakonda”为例。拆分它的最佳方式是k1=“a”,k2=“na”,k3=“konda”,因为在反转(k1=“a”,k2=“an”,k3=“adnok”)之后,我们得到了k1+k2+k3=“aanadnok”,

一段时间以来,我一直在试图解决这个看似非常简单的问题。给定一个字符串k,我们必须找到最佳方法将该字符串k拆分为3个子字符串k1,k2,k3,比如k1+k2+k3=k。拆分是最优的,当且仅当通过反转每个子字符串并将它们重新连接在一起,我们可以得到尽可能最小的词典结果

例如,以字符串k=“anakonda”为例。拆分它的最佳方式是k1=“a”,k2=“na”,k3=“konda”,因为在反转(k1=“a”,k2=“an”,k3=“adnok”)之后,我们得到了k1+k2+k3=“aanadnok”,这是词典中最小的可能结果

我的第一种方法是总是在下一个字典最小的字符处结束子字符串

std::string str = "anakonda"

int first = find_min(str, 0, str.size() - 3); // Need to have at least 3 substrings so cannot search to the end
std::reverse(str.begin(), str.begin() + first + 1);

...
然而,这种方法是有缺陷的,因为给定字符串k=“ggggffffa”,该算法将无法工作。
我不知道如何正确地解决这个问题。因此,我要求提供一个理论解决方案,以便我可以尝试自己实现它。

此算法解决了问题,但可能需要优化:

#include <iostream>
#include <string>

std::string foo(std::string* ss) 
{ 
    std::string res;
    for (int i = 0; i < 3; i++)
        for (int j = ss[i].size()-1; j >= 0; j--) 
        res.push_back(ss[i][j]);
    return res;
}

int main()
{
  std::string s = "ggggffffa";
  std::string res = "";
  for (unsigned int i = 1; i < s.size() - 1; i++)
    for (unsigned int j = 0; j < i; j++)
    {
        std::string ss[3] = {s.substr(0, j+1), s.substr(j+1, i-j), s.substr(i+1)};
        std::string r = foo(ss);
        if (r < res || res == "") res = r;
    }
    std::cout << res << std::endl;  
}
  • С所有函数
    foo
    ,该函数反转每个子字符串,连接三个部分并返回结果字符串
  • 检查foo生成的字符串是否最小,然后为结果指定一个新字符串
  • if(r
    如果有帮助的话,这只是一个描述的额外负担。字符串毕竟只是一个字符数组。
    k1
    k2
    k3
    可以为空吗?问题总是保证会有一个解决方案,使k1、k2、k3>=1且不能为空。@emufan4568好的,
    ggggggffa
    的答案是什么?是不是
    fffgggfa
    ,输出变得正确。对于输入:“bndakonda”,输出应为“adnbdnoka”。
    for (unsigned int i = 1; i < s.size() - 1; i++)
        for (unsigned int j = 0; j < i; j++)
    
    std::string ss[3] = {s.substr(0, j+1), s.substr(j+1, i-j), s.substr(i+1)};
    
    if (r < res || res == "") res = r;