📌  相关文章
📜  检查是否可以通过反转任何子字符串来使字符串在字典上变小(1)

📅  最后修改于: 2023-12-03 15:40:34.926000             🧑  作者: Mango

检查是否可以通过反转任何子字符串来使字符串在字典上变小

有一个长度为 n 的字符串s,如果可以通过反转 s 中任意子字符串的方式使得字典序变小,那么返回 true,否则返回 false。

思路

我们可以看到,对于一段子字符串,如果把它反转过来,字符的排列顺序就会颠倒,这样就改变了字典序。那么我们可以发现,如果我们在遍历 s 的时候,碰到一个字符是比前一个字符小的,我们必须把前一个字符反转过来了,才能满足让字符串的字典序变小。因为反转前面的字符并不会影响后面的字典序。

例如:假设原字符串为 "cba" ,我们需要将 c 反转过来得到 "abc", 才能让字符串的字典序变小。

但是,如果我们碰到一个字符是比前一个字符大的,我们就无能为力,因为反转前面的字符并不能使得字典序变小。

例如:假设原字符串为 "abdc" ,我们无法将 a 或 b 反转过来让字典序变小,因为反转前面的字符对后面的字典序没有影响。

总之,只要我们还有机会反转前面的字符,就一直反转下去,否则字符串就无法变小了。

示例代码
def checkString(s:str) -> bool:
    n = len(s)
    if n < 2:
        return False

    # 标志是否需要反转前面的字符
    need_reverse = False
    for i in range(1, n):
        # 碰到当前字符比前一个字符小,且可以继续反转前面的字符,则将 need_reverse 设为 True
        if s[i] < s[i-1] and not need_reverse:
            need_reverse = True
        # 碰到当前字符比前一个字符大,返回 False
        elif s[i] > s[i-1]:
            return False
    # 全部遍历完之后返回 True
    return True

这里我们使用了 python 语言来完成代码的编写,通过 python 内置的运算符进行了字符串的比较,简化了代码的实现过程。

时间复杂度

该算法只需要通过一次字符串 s 的遍历,所以时间复杂度是 O(n)。

空间复杂度

该算法只需要使用常数级别的额外空间,所以空间复杂度是 O(1)。

参考文献
  • Leetcode 原题
  • 《算法图解》(Aditya Bhargava 著,袁国忠 译,人民邮电出版社)