gpt4 book ai didi

string - 算法:最佳地将字符串拆分为 3 个子字符串

转载 作者:行者123 更新时间:2023-12-04 13:35:04 24 4
gpt4 key购买 nike

一段时间以来,我一直试图解决这个看似非常简单的问题。给定字符串 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;
}
描述:
  • 我们通过两个迭代器(第一个迭代器从第一个元素到字符串的末尾,第二个迭代器从零元素到第一个迭代器)以这种方式确定用于拆分字符串的所有可能索引。
  • for (unsigned int i = 1; i < s.size() - 1; i++)
    for (unsigned int j = 0; j < i; j++)
  • 在索引处拆分字符串 i , j并在字符串数组中写入三个子字符串;
  • std::string ss[3] = {s.substr(0, j+1), s.substr(j+1, i-j), s.substr(i+1)};
  • С所有功能foo它反转每个子字符串,连接三个部分并返回结果字符串。
  • 检查 foo 的结果字符串是否按字典顺序最小,然后为结果分配一个新字符串。
  • if (r < res || res == "") res = r;

    关于string - 算法:最佳地将字符串拆分为 3 个子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62624493/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com