【发布时间】:2020-10-18 19:28:42
【问题描述】:
一段时间以来,我一直试图解决这个看似非常简单的问题。给定一个字符串 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",该算法将无法工作。 我对如何正确解决这个问题一无所知。所以,我要求一个理论上的解决方案,以便我可以尝试自己实现它。
【问题讨论】:
-
如果有帮助,这只是围绕3-way partition. 描述的大量额外包袱。毕竟,字符串只是一个字符数组。
-
k1,k2或k3可以为空吗? -
这个问题总是保证会有一个解所以k1,k2,k3 >= 1并且不能为空。
-
@emufan4568 好的,
ggggffffa的答案是什么? -
是
fffggggfa吗?
标签: string algorithm substring