【Leetcode】1328. Break a Palindrome

博客围绕LeetCode上的题目展开,给定非空回文串s,允许改一个字母,求字典序最小且非回文的字符串。分析得出修改串前半部分字母可得非回文串,给出遍历求解思路,还排除ls=1的情况,时间复杂度O(ls),空间O(1)。

题目地址:

https://leetcode.com/problems/break-a-palindrome/

给定一个只含英文小写字母的非空回文串 s s s,允许将其中一个字母改为另一个英文小写字母,问能得到的字典序最小且非回文的字符串是什么。如果做不到则返回空串。

首先,由于 s s s本身就是回文串,我们修改串前半部分的任意字母都会得到非回文串,而我们又需要字典序最小,所以先遍历 s [ 0 : l s / 2 − 1 ] s[0:l_s/2-1] s[0:ls/21],如果第一次遇到了非'a'的字符,直接将其改为'a'返回即可。如果前半部分都是'a',则说明后半部分也都是'a',那么可以得到的最小字典序就是将最后一个字母改为'b'。但这里要排除掉 l s = 1 l_s=1 ls=1的情况。代码如下:

class Solution {
 public:
  string breakPalindrome(string s) {
    if (s.size() == 1) return "";
    for (int i = 0, j = s.size() - 1; i < j; i++, j--) {
      if (s[i] != 'a') {
        s[i] = 'a';
        return s;
      }
    }

    s.back() = 'b';
    return s;
  }
};

时间复杂度 O ( l s ) O(l_s) O(ls),空间 O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值