最近我一直试图理解这个看似非常简单的问题。给定一个字符串 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",该算法将无法工作。 我不知道如何正确解决这个问题。因此,我请求一个理论上的解决方案,以便我可以尝试自己实现它。
fffggggfa
吗? - nice_dev