在一个由 ‘L’ , ‘R’ 和 ‘X’ 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。
一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。
解题思路:
‘XL’ -> ‘LX’
‘RX’ -> ‘XR’
可以连续交换,因此我们比较非’X’字符,但交换不可逆,因此有顺序前后关系
同为’L’字符,且start中’L’的索引≥end中’L’的索引,匹配继续;
同为’R’字符,start中’R’的索引≤end中’R’的索引,匹配继续;
否则匹配结束,返回False;
若两者最后同时抵达字符串末尾,返回True,若只有一端抵达末尾,说明存在字符不匹配,返回
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
if len(nums)<2:
return []
cur = set()
cur.add((nums[0],))
for num in nums[1:]:
nxt = set()
nxt.add((num,))
for tmp in cur:
if tmp[-1] <= num:
nxt.add(tmp + (num,))
cur |= nxt
return [sub for sub in cur if len(sub) > 1]