华为OD机试真题—— 判断字符串子序列(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

发布于:2025-05-26 ⋅ 阅读:(115) ⋅ 点赞:(0)

在这里插入图片描述

2025 B卷 100分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享

华为OD机试真题《判断字符串子序列》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C++

C

GO


题目名称:判断字符串子序列


  1. 知识点:字符串、双指针算法、逻辑处理
  2. 时间限制:1秒
  3. 空间限制:256MB
  4. 限定语言:不限

题目描述

华为OD机试题原题:判断字符串子序列

题目描述

给定两个字符串 targetsource,判断 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 的子序列,并返回最后一个匹配的起始位置。子序列需保证字符顺序但可不连续,且要找到最右边的起始点。


解题思路

  1. 逆向遍历:从 source 末尾开始向前遍历,寻找 target 的每个字符的最后出现位置。
  2. 记录位置:当匹配到 target 的字符时,记录其在 source 中的位置。
  3. 确定起始点:若所有字符均匹配,则第一个记录的字符位置即为最后一个匹配的起始位置。

代码实现

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;
    }
}

代码解析

  1. 输入处理:读取 targetsource,并进行去空格处理。
  2. 空处理:若 target 为空,直接返回 -1。
  3. 字符数组转换:将字符串转为字符数组方便索引操作。
  4. 位置记录数组positions 数组用于保存 target