题目

标题和出处

标题:破坏回文串

出处:1328. 破坏回文串

难度

4 级

题目描述

要求

给你一个由小写英语字母组成的回文字符串 字符串题目:破坏回文串 - 图1,请你将其中一个字符用任意小写英语字母替换,使得结果字符串不是回文串,且字典序最小

请你返回结果字符串。如果无法替换一个字符使得结果字符串不是回文串,则返回空串

对于相同长度的字符串 字符串题目:破坏回文串 - 图2字符串题目:破坏回文串 - 图3,如果在第一个 字符串题目:破坏回文串 - 图4字符串题目:破坏回文串 - 图5 不同的位置,字符串题目:破坏回文串 - 图6 中的字符严格小于 字符串题目:破坏回文串 - 图7 中的对应字符,则字符串 字符串题目:破坏回文串 - 图8 字典序小于字符串 字符串题目:破坏回文串 - 图9。例如,字符串题目:破坏回文串 - 图10 字典序小于 字符串题目:破坏回文串 - 图11,因为第一个不同的位置是第四个字符,字符串题目:破坏回文串 - 图12 小于 字符串题目:破坏回文串 - 图13

示例

示例 1:

输入:字符串题目:破坏回文串 - 图14
输出:字符串题目:破坏回文串 - 图15
解释:有很多种方法将 字符串题目:破坏回文串 - 图16 变成非回文串,例如 字符串题目:破坏回文串 - 图17字符串题目:破坏回文串 - 图18字符串题目:破坏回文串 - 图19。其中,字符串题目:破坏回文串 - 图20 是字典序最小的。

示例 2:

输入:字符串题目:破坏回文串 - 图21
输出:字符串题目:破坏回文串 - 图22
解释:无法替换一个字符使得 字符串题目:破坏回文串 - 图23 变成非回文串,因此返回空串。

示例 3:

输入:字符串题目:破坏回文串 - 图24
输出:字符串题目:破坏回文串 - 图25

示例 4:

输入:字符串题目:破坏回文串 - 图26
输出:字符串题目:破坏回文串 - 图27

数据范围

  • 字符串题目:破坏回文串 - 图28
  • 字符串题目:破坏回文串 - 图29 只包含小写英语字母

解法

思路和算法

任意长度为 字符串题目:破坏回文串 - 图30 的字符串一定是回文串,因此当字符串 字符串题目:破坏回文串 - 图31 的长度为 字符串题目:破坏回文串 - 图32 时,无论如何替换,得到的字符串一定是回文串,无法得到非回文串,此时返回空串。

当字符串 字符串题目:破坏回文串 - 图33 的长度大于 字符串题目:破坏回文串 - 图34 时,如果长度为偶数,则所有的字符都不在对称中心上,如果长度为奇数,则只有一个字符在对称中心上,其余字符都不在对称中心上,因此只要替换任意一个不在对称中心上的字符,即可得到非回文串的结果字符串。

为了得到字典序最小的结果字符串,应该选择 字符串题目:破坏回文串 - 图35 中尽可能靠前的字符做替换。由于字典序最小的字母是 字符串题目:破坏回文串 - 图36,因此应该找到非对称中心的第一个不是 字符串题目:破坏回文串 - 图37 的字符,将其替换成 字符串题目:破坏回文串 - 图38

由于在回文串中,对称中心右边的每一个字符都在对称中心左边有一个对应的相同的字符,因此只需要遍历对称中心的左边,找到第一个不是 字符串题目:破坏回文串 - 图39 的字符,将其替换成 字符串题目:破坏回文串 - 图40 即可。

如果所有的字符都是 字符串题目:破坏回文串 - 图41,则为了得到非回文串,必须将一个字符改成非 字符串题目:破坏回文串 - 图42 的字符,使结果字符串的字典序增加。为了得到字典序最小的结果字符串,应该将最后一个字符替换成 字符串题目:破坏回文串 - 图43

代码

  1. class Solution {
  2. public String breakPalindrome(String palindrome) {
  3. int n = palindrome.length();
  4. if (n == 1) {
  5. return "";
  6. }
  7. char[] array = palindrome.toCharArray();
  8. int half = n / 2;
  9. for (int i = 0; i < half; i++) {
  10. char c = array[i];
  11. if (c != 'a') {
  12. array[i] = 'a';
  13. return new String(array);
  14. }
  15. }
  16. array[n - 1] = 'b';
  17. return new String(array);
  18. }
  19. }

复杂度分析

  • 时间复杂度:字符串题目:破坏回文串 - 图44#card=math&code=O%28n%29&id=DhFSs),其中 字符串题目:破坏回文串 - 图45 是字符串 字符串题目:破坏回文串 - 图46 的长度。需要遍历字符串 字符串题目:破坏回文串 - 图47 的前一半。
  • 空间复杂度:字符串题目:破坏回文串 - 图48#card=math&code=O%28n%29&id=HXlT1),其中 字符串题目:破坏回文串 - 图49 是字符串 字符串题目:破坏回文串 - 图50 的长度。需要额外创建一个长度为 字符串题目:破坏回文串 - 图51字符串题目:破坏回文串 - 图52 类型的数组用于存储结果字符串。由于 Java 中的 字符串题目:破坏回文串 - 图53 类型的对象不可变,因此空间复杂度至少为 字符串题目:破坏回文串 - 图54#card=math&code=O%28n%29&id=cNPlq)。