String 算法:将字符串最优地拆分为3个子字符串
一段时间以来,我一直在试图解决这个看似非常简单的问题。给定一个字符串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”,这是词典中最小的可能结果 我的第一种方法是总是在下一个字典最小的字符处结束子字符串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”,
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
,该函数反转每个子字符串,连接三个部分并返回结果字符串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;