通过率 35% · 提交 1,304 · 通过 462
小慕正在处理两个字符串:一个叫 S,一个叫 L,它们都只包含小写字母。S 的长度不超过 100,L 的长度不超过 500000。小慕需要判断 S 是否是 L 的一个。 判定规则是:S 中的每一个字符,都能在 L 中按顺序找到(可以不连续),并且这些字符在 L 中出现的先后顺序必须与 S 中的顺序一致。 举个例子:S = "ace" 是 L = "abcde" 的一个有效,因为字符 a、c、e 在 L 中按顺序出现。而 "aec" 就不是有效子序列,因为 e 出现在 c 之前,顺序不一致,此时只有 a 和 e 符合位置要求。
这类题属于华为 OD 机考真题方向中「100分 / 双指针」方向的高频题型,通常考察对「100分 / 双指针」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入两个字符串S和L,都只包含小写字母,len(S) <= 100,len(L) <= 500000,先输入S再输入L 每个字符串占一行。
S串最后一个有效字符在L中的位置,首位从0开始计算。无有效字符返回 -1
示例 1
输入示例
ace abcde
输出示例
4
示例 2
输入示例
fgh abcde
输出示例
-1
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
注意,本题和 判断子序列 几乎完全一致。唯一的不同之处在于本题不仅要判断 S 能够由 L 构成,还要得到 S 串最后一个有效字符在 L 中的位置。这实际上进一步提醒我们应该用 贪心思想 来解决这个问题。
需要特别注意,经过同学考试测试,对于例子:
应该输出:
这是因为,S = "he" 虽然在 L = "ehh" 中不能够完全匹配,但是能够匹配第一个字符 "h",这个 "h" 是 S 的最后一个有效字符,在 L 中第一次出现的位置是 1,故输出答案为 1。
也就是说,题目要求寻找的字符,是按照 S 中的顺序,在 S 中最后一个出现在 L 中的字符,但并不要求 S 的最后一个字符一定要出现在 L 中。这和 判断子序列 的要求略有不同,但是在代码上是非常接近的。
仅需一个简单的例子就可以看出为何要使用 贪心思想:假设 L = "abac",S = "abc"。当我们做字符匹配时,当然会选择 L 中的第一个 "a" 而不是第二个 "a" 来与 S 中的 "a" 进行匹配。因为只有选择了尽量靠前的 "a",才能使得 S 更有可能由 L 中的字符按照顺序构成。
故我们只需设置两个 同向双指针 pl 和 ps,分别用于 L 和 S 从左到右的遍历。当:
S[ps] == L[pl] 时,说明当前 L 中字符能与 S 匹配,此时应该记录 ans = pl,是当前遇到的 S 中的最新的一个有效字符在 L 中的索引,同时 pl 和 ps 各自前进。S[ps] != L[pl] 时,说明当前 L 中字符不能与 S 匹配,此时 ps 不应该移动,pl 前进一位,去寻找 L 中下一个能和 S[ps] 匹配的字符。上述过程应该在一个 while 循环 中进行,退出循环的条件是 pl 到达 L 末尾 nl 或者 ps 到达 S 末尾 ns。故上述算法的主体代码为:
我们可以初始化 ans 为 -1,那么只要在循环中没有进入 if S[ps] == L[pl] 的分支,就说明 S 中没有任意一个字符能够跟 L 进行匹配,最终结果应该为 -1。最终输出 ans 即可。
复杂度分析
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有