题目描述:在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。
1 | 输入: start = "RXXLRXRXL", end = "XRLXXRRLX" |
题解
官方法一
转换不变性:字符串中的
'L'和'R'是不会互相穿插的,意味着开始和结束的字符串如果只看'L'和'R'的话是一模一样的。可到达性:设 $(i_1, i_2, \cdots ),(i^{‘}_1, i^{‘}_2, \cdots )$为每个字符 ‘L’ 在原始字符串和目标字符串的位置,$(j_1, j_2, \cdots )(j^{‘}_1, j^{‘}_2, \cdots )$为每个字符 ‘R’ 在原始字符串和目标字符串的位置,如果$i_k \geq i^{‘}_k $和 $j_k \leq j^{‘}_k $都能满足,这个字符串就是 ”可到达的“。
L只能向左移,R只能向右移
1 | class Solution(object): |
enumerate() 函数
1
2
3
4
5enumerate(sequence, [start=0])
sequence -- 一个序列、迭代器或其他支持迭代对象。
start -- 下标起始位置。
返回 enumerate(枚举) 对象1
2
3
4
5
6
7>>>seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
print( i, element)
0 one
1 two
2 three
官方解二:双指针
1 | class Solution(object): |
zip()、zip.longest()
1
2
3
4
5
6
7a = [1,2,3,4]
b = [5,6,7]
print(list(zip(a,b))) # 两个可迭代参数长度不同时,按最短的组合输出
# 输出:[(1, 5), (2, 6), (3, 7)]
print(list(zip_longest(a,b)))#按最长的输出,长度不足的用None进行代替
# 输出:[(1, 5), (2, 6), (3, 7), (4, None)]
用时最快
1 | class Solution: |