1. 判断字符串子序列
1.1. 题目描述
给定字符串 target和 source,判断 target是否为 source 的子序列。
你可以认为target和 source 中仅包含英文小写字母。
字符串 source 可能会很长(长度~=500,000),而 target是个短字符串(长度<=100)。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。
(例如,”abc”是”aebycd”的一个子序列,而”ayb”不是)。
请找出最后一个子序列的起始位置。
1.2. 输入描述
第一行为target,短字符串(长度 <=100)
第二行为source,长字符串(长度 ~= 500,000)
1.3. 输出描述
最后一个子序列的起始位置,即最后一个子序列首字母的下标
备注
若在source中找不到target,则输出-1。
1.4. 用例
输入 abc
abcaybec
输出 3
说明 这里有两个abc的子序列满足,取下标较大的,故返回3。
1.5. 题目解析
最后一个符合条件的子串那就从右边开始扫描。
匹配的方式也比较简单,两个指针,分别指向source和target。从右往左遍历source,如果source和target相等,两个指针就都左移一位,否则就source左移。
1.6. 代码
class Solution:
def __call__(self, source: str, target: str):
cursor = len(target) - 1
for i in range(len(source)-1, -1, -1):
if source[i] == target[cursor]:
cursor -= 1
if cursor < 0:
return i
return -1