📅  最后修改于: 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)。