【发布时间】:2019-08-06 07:13:40
【问题描述】:
这是来自https://www.dailycodingproblem.com/的问题:
给定一个字符串,找出可以通过插入 在单词中的任何位置尽可能少的字符。如果有 是不止一个可以产生的最小长度回文,返回 字典上最早的一个(按字母顺序排列的第一个)。
例如,给定字符串“race”,您应该返回“ecarace”, 因为我们可以向它添加三个字母(这是最小的数量 做回文)。还有其他七个回文可以制作 来自“race”,添加三个字母,但“ecarace”排在第一位 按字母顺序。
作为另一个例子,给定字符串“google”,你应该返回 “elgoogle”。
类似于this SO question,或thisGeeksforGeeks 帖子。相似,但不一样;他们都没有为重复提供任何解释,就好像他们凭空提取了解决方案,并且他们没有重建解决方案,更不用说字典上最早的解决方案了。
经过一番思考,我的理解如下:
观察任何字符串
s[i..j],如果s[i] == s[j],那么 使其成为回文所需的插入次数与 使s[i+1..j-1]成为回文所需的插入次数。但是,如果
s[i] != s[j],那么我们可以将s[i..j-1]转换为 回文然后在开头插入s[j],或者转换s[i+1..j]到回文并在末尾插入s[i]。既然我们是 寻找最少的插入次数,我们将选择 两个选项中的最小值。插入次数多于 1 所选子问题所需的插入次数(对于 在开头或结尾添加一个字符)。
我如何重建字典序上最早的解决方案?
【问题讨论】:
标签: string algorithm dynamic-programming palindrome