字典序最小回文串
题目解读
给你一个由 小写英文字母 组成的字符串 s ,你可以对其执行一些操作。在一步操作中,你可以用其他小写英文字母 替换 s 中的一个字符。
请你执行 尽可能少的操作 ,使 s 变成一个 回文串 。如果执行 最少 操作次数的方案不止一种,则只需选取 字典序最小 的方案。
对于两个长度相同的字符串 a 和 b ,在 a 和 b 出现不同的第一个位置,如果该位置上 a 中对应字母比 b 中对应字母在字母表中出现顺序更早,则认为 a 的字典序比 b 的字典序要小。
返回最终的回文字符串。
示例 1:
输入:s = “egcfe”
输出:“efcfe”
解释:将 “egcfe” 变成回文字符串的最小操作次数为 1 ,修改 1 次得到的字典序最小回文字符串是 “efcfe”,只需将 ‘g’ 改为 ‘f’ 。
示例 2:
输入:s = “abcd”
输出:“abba”
解释:将 “abcd” 变成回文字符串的最小操作次数为 2 ,修改 2 次得到的字典序最小回文字符串是 “abba” 。
示例 3:
输入:s = “seven”
输出:“neven”
解释:将 “seven” 变成回文字符串的最小操作次数为 1 ,修改 1 次得到的字典序最小回文字符串是 “neven” 。
提示:
1 <= s.length <= 1000
s 仅由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lexicographically-smallest-palindrome
思路分析
要将字符串转变为回文串,并且字典序最小,可以使用双指针的方法进行操作:
- 初始化两个指针 left 和 right,分别指向字符串的开头和结尾。
- 当 left < right 时,进行循环:
- 如果 s[left] != s[right],则需要进行替换操作。
- 优先替换较大的字符为较小的字符,即将 s[right] 替换为 s[left]。
- 继续移动指针,left 向右移动一步,right 向左移动一步。
- 重复步骤2和步骤3,直到 left >= right。
- 返回经过操作后得到的回文串。
通过以上步骤,可以将给定的字符串转变为一个字典序最小的回文串。以下是具体的代码实现:
class Solution(object):
def makeSmallestPalindrome(self, s):
s = list(s)
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
if s[right] < s[left]:
s[left] = s[right]
else:
s[right] = s[left]
left += 1
right -= 1
return ''.join(s)
使用上述代码对示例进行测试可以得到相应的结果。
算法解析
该解使用了贪心算法,通过双指针从字符串的两端向中间遍历。当左右指针指向的字符不相同时,根据题目要求选择将较小的字符赋值给较大的字符,以保证生成的回文串是字典序最小的。
贪心策略是一种求解最优化问题的常用算法思想,它在每一步都选择当前情况下看起来最优的选择,而不考虑未来可能发生的变化。贪心算法的核心思想是通过局部最优解的选择来达到全局最优解。
具体来说,贪心策略通常包括以下步骤:
- 定义问题的目标函数或者评价指标。
- 将问题分解成若干个子问题。每个子问题都应该是原问题的一个局部部分,并且该子问题的最优解能够推导出原问题的最优解。
- 通过贪心选择性质,确定每个子问题的最优选择。即在每一步中,根据局部最优解的选择准则,做出当前步骤的最优选择。
- 将局部最优解组合起来,得到原问题的解。
需要注意的是,贪心算法并不适用于所有的最优化问题。在某些情况下,它可能会得到次优解或者无法得到正确解。因此,在使用贪心算法时需要仔细分析问题的性质,确保贪心选择性质可以得到全局最优解。
总结起来,贪心策略是一种简单而高效的求解最优化问题的方法,它通过每一步的局部最优选择来达到全局最优解。
具体算法步骤如下:
- 将字符串转换为列表,方便修改字符。
- 初始化左右指针指向字符串的首尾字符。
- 当左指针小于右指针时,执行循环操作:
- 如果左右指针指向的字符不相同,则根据字典序规则,将较小的字符赋值给较大的字符。
- 每次循环后,移动左指针向右,右指针向左,继续比较下一对字符。
- 循环结束后,返回将列表转换为字符串的结果。
该算法实现了尽可能少的操作,使原字符串变成一个回文串,并且保证了生成的回文串是字典序最小的。
循环后,移动左指针向右,右指针向左,继续比较下一对字符。
5. 循环结束后,返回将列表转换为字符串的结果。
该算法实现了尽可能少的操作,使原字符串变成一个回文串,并且保证了生成的回文串是字典序最小的。