LC 1585. 检查字符串是否可以通过排序子字符串得到另一个字符串
https://leetcode-cn.com/problems/check-if-string-is-transformable-with-substring-sort-operations/
这题很容易想去做排序,但是重复排序一方面会造成太多不要计算,同时会打乱之前创建好的索引,另外寻找排序的区间也是一个很大的问题。
但是如果换个角度,我们只关心能否将每个数字各就其位的话,就简单多了。如果一个数字不匹配,那么就去后面找这个数字,让这个数字提前。 但是因为提前的方法是排序,所以必须确保,从当前数字到期望找到的数字中间,没有更小的数字出现。
以 s = "84532", t = "34852" 为例
- 我们期望匹配 '3', 在s中第一个'3'之前的数字是'845'. 所以可以将3提前(并且从s中抹去)
- 然后匹配'4', 在s中第一个'4'之前的数字是'8', 所以可以将4提前(并且抹去)
- 接着'8'可以匹配
- '5'可以提前,是因为之前的'84'都已经匹配了
- 最后'2'可以匹配
class Solution: def isTransformable(self, s: str, t: str) -> bool: pos = [[] for _ in range(10)] for i in reversed(range(len(s))): c = ord(s[i]) - ord('0') pos[c].append(i) for i in range(len(t)): c = ord(t[i]) - ord('0') if not pos[c]: return False p = pos[c][-1] pos[c].pop() # 确保没有更小的数在这个位置之前 for j in range(c): if not pos[j]: continue if pos[j][-1] < p: return False return True