华为OD机试真题—— 判断字符串子序列(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 B卷 100分 题型
本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》
华为OD机试真题《判断字符串子序列》:
文章快捷目录
题目描述及说明
Java
python
JavaScript
C++
C
GO
题目名称:判断字符串子序列
- 知识点:字符串、双指针算法、逻辑处理
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
华为OD机试题原题:判断字符串子序列
题目描述
给定两个字符串 target
和 source
,判断 target
是否为 source
的子序列。
- 字符串仅包含英文小写字母。
source
可能很长(长度 ≤ 500,000),target
较短(长度 ≤ 100)。- 子序列定义:通过删除
source
中的某些字符(可不删除)而不改变剩余字符的相对顺序形成的新字符串。例如,“abc” 是 “aebycd” 的子序列,但 “ayb” 不是。 - 输出要求:返回
target
作为source
子序列的最后一个匹配的起始位置(首字母下标,从0开始)。若不存在,返回-1
。
输入描述
- 第一行为
target
,第二行为source
。
输出描述
- 一个整数,表示最后一个子序列的起始位置或
-1
。
示例
输入:
abc
abcaybec
输出:
3
说明:存在两个匹配的子序列(起始位置0和3),取最后一个。
Java
问题分析
题目要求判断字符串 target
是否为 source
的子序列,并返回最后一个匹配的起始位置。子序列需保证字符顺序但可不连续,且要找到最右边的起始点。
解题思路
- 逆向遍历:从
source
末尾开始向前遍历,寻找target
的每个字符的最后出现位置。 - 记录位置:当匹配到
target
的字符时,记录其在source
中的位置。 - 确定起始点:若所有字符均匹配,则第一个记录的字符位置即为最后一个匹配的起始位置。
代码实现
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String target = scanner.nextLine().trim();String source = scanner.nextLine().trim();int result = findLastStartPosition(target, source);System.out.println(result);}private static int findLastStartPosition(String target, String source) {if (target.isEmpty()) return -1; // 空字符串处理char[] tArr = target.toCharArray();char[] sArr = source.toCharArray();int[] positions = new int[tArr.length]; // 存储匹配的位置Arrays.fill(positions, -1);int i = tArr.length - 1; // 从 target 的最后一个字符开始匹配for (int j = sArr.length - 1; j >= 0 && i >= 0; j--) {if (sArr[j] == tArr[i]) {positions[i] = j; // 记录当前字符的位置i--; // 继续匹配前一个字符}}// 如果所有字符均匹配,返回起始位置(positions[0])return (i == -1) ? positions[0] : -1;}
}
代码解析
- 输入处理:读取
target
和source
,并进行去空格处理。 - 空处理:若
target
为空,直接返回 -1。 - 字符数组转换:将字符串转为字符数组方便索引操作。
- 位置记录数组:
positions
数组用于保存target