LeetCode 题解工作台
得到回文串的最少操作次数
给你一个只包含小写英文字母的字符串 s 。 每一次 操作 ,你可以选择 s 中两个 相邻 的字符,并将它们交换。 请你返回将 s 变成回文串的 最少操作次数 。 注意 ,输入数据会确保 s 一定能变成一个回文串。 示例 1: 输入: s = "aabb" 输出: 2 解释: 我们可以将 s 变成 2…
4
题型
4
代码语言
3
相关题
当前训练重点
困难 · 双·指针·invariant
答案摘要
由于题目保证原串一定可以变成回文串,那么原串中最多只有一种字母出现奇数次。如果有一种字母出现奇数次,那么将该字母中排在最中间的字符移动到字符串中间,剩下的字符可以转化为所有字母均出现偶数次的情况。 贪心算法是:每次固定字符串最左边的字母 不变,找出距离字符串右侧最近的 ,把它交换到字符串最右边。这样字符串的头尾字母就相等了。把字符串的头尾去掉,就变成了子问题。把所有子问题的答案加起来就是最少交换…
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 双·指针·invariant 题型思路
题目描述
给你一个只包含小写英文字母的字符串 s 。
每一次 操作 ,你可以选择 s 中两个 相邻 的字符,并将它们交换。
请你返回将 s 变成回文串的 最少操作次数 。
注意 ,输入数据会确保 s 一定能变成一个回文串。
示例 1:
输入:s = "aabb" 输出:2 解释: 我们可以将 s 变成 2 个回文串,"abba" 和 "baab" 。 - 我们可以通过 2 次操作得到 "abba" :"aabb" -> "abab" -> "abba" 。 - 我们可以通过 2 次操作得到 "baab" :"aabb" -> "abab" -> "baab" 。 因此,得到回文串的最少总操作次数为 2 。
示例 2:
输入:s = "letelt" 输出:2 解释: 通过 2 次操作从 s 能得到回文串 "lettel" 。 其中一种方法是:"letelt" -> "letetl" -> "lettel" 。 其他回文串比方说 "tleelt" 也可以通过 2 次操作得到。 可以证明少于 2 次操作,无法得到回文串。
提示:
1 <= s.length <= 2000s只包含小写英文字母。s可以通过有限次操作得到一个回文串。
解题思路
方法一:贪心
由于题目保证原串一定可以变成回文串,那么原串中最多只有一种字母出现奇数次。如果有一种字母出现奇数次,那么将该字母中排在最中间的字符移动到字符串中间,剩下的字符可以转化为所有字母均出现偶数次的情况。
贪心算法是:每次固定字符串最左边的字母 不变,找出距离字符串右侧最近的 ,把它交换到字符串最右边。这样字符串的头尾字母就相等了。把字符串的头尾去掉,就变成了子问题。把所有子问题的答案加起来就是最少交换次数。
由于数据范围较小,通过 的模拟即可通过本题。
证明:
构造回文串的过程,实际上是每次选择一对字母并把它们交换到字符串头尾的过程。考虑字母 和字母 哪个先选,分以下情况讨论:
- 字母 和 的位置满足 。如果先把 换到头尾,再把 换到头尾,那么需要 次交换;如果先换 再换 ,那么需要 次交换。显然先换 更优。
- 字母 和 的位置满足 。如果先换 再换 ,那么需要 次交换;如果先换 再换 ,那么需要 次交换。先换哪个都一样。
- 字母 和 的位置满足 。如果先换 再换 ,那么需要 次交换;如果先换 再换 ,那么需要 次交换。先换哪个都一样。
上述讨论可以得到结论:每次交换最外边出现的字母不劣。因此贪心解法成立。
class Solution:
def minMovesToMakePalindrome(self, s: str) -> int:
cs = list(s)
ans, n = 0, len(s)
i, j = 0, n - 1
while i < j:
even = False
for k in range(j, i, -1):
if cs[i] == cs[k]:
even = True
while k < j:
cs[k], cs[k + 1] = cs[k + 1], cs[k]
k += 1
ans += 1
j -= 1
break
if not even:
ans += n // 2 - i
i += 1
return ans
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | Depends on the final approach |
| 空间 | Depends on the final approach |
面试官常问的追问
外企场景- question_mark
Check if the candidate utilizes two-pointer scanning effectively.
- question_mark
Evaluate if the candidate can explain how a greedy strategy minimizes swaps.
- question_mark
Look for a clear understanding of how tracking the invariants can optimize the solution.
常见陷阱
外企场景- error
Failing to correctly implement the two-pointer approach could lead to unnecessary swaps.
- error
Overcomplicating the solution with additional space or inefficient algorithms.
- error
Not recognizing that tracking invariants can lead to more optimal swap strategies.
进阶变体
外企场景- arrow_right_alt
Consider variations where the string length is constrained to a smaller value.
- arrow_right_alt
Explore cases where there are multiple possible palindrome outcomes.
- arrow_right_alt
Introduce variations where swaps must be limited to a specific number.