目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
给定字符串target和source,判断target是否为source的子序列。你可以认为target和source 中仅包含英文小写字母,字符串source可能会很长,长度~=500,000,而target是个短字符串,长度<=100。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置。形成的新字符串,例如,'abc’是’aebycd’的一个子序列,而’ayb’不是。请找出最后一个序列的起始位置。
二、输入描述
第一行输入字符串target;
第二行输入原始字符串source;
比如:
abc
abcaybec
三、输出描述
请找出最后一个序列的起始位置。
3
abcaybec中第0位的abc也匹配,但却不是最后匹配的序列。abcaybec中第3位的aybec去掉字符y、e后也为abc,也与目标字符串相符,故输出最后一个序列aybec的第一个字符的索引位置3。
四、解题思路
- 第一行输入给定字符串target;
- 第二行输入原始字符串source;
- 倒序遍历target和source;
- 判断字符串子序列;
- 如果字符相等,则遍历target和source的下一个index;
- 没有找到相等的字符,继续向左遍历source字符串;
- 当i==0时,遍历完毕;
- 输出最后一个序列的起始位置;
五、Java算法源码
package com.guor.od;
import java.util.Scanner;
public class OdTest01 {
/**
* 判断字符串子序列
* @autor 哪吒
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 判断target是否为source的子序列
String target = sc.nextLine();
String source = sc.nextLine();
int targetLength = target.length();
int sourceLength = source.length();
int i = targetLength - 1;
int j = sourceLength - 1;
// 是否有匹配的子序列
boolean flag = false;
// 逆序遍历
while (i >= 0 && j >= 0) {
if (target.charAt(i) == source.charAt(j)) {
// 遍历完毕
if (i == 0) {
flag = true;
System.out.println(j);
}
i--;
j--;
} else {
// 没有找到相等的字符,继续向左遍历source字符串
j--;
}
}
if (!flag) {
System.out.println(-1);
}
}
}
六、效果展示
1、输入
java
jnejzhavuea
2、输出
3
3、说明
jnejzhavuea中第0位的abc也匹配,但却不是最后匹配的序列。jnejzhavuea中第3位的j也可以与后面匹配成子串java,,故输出最后一个序列jzhavuea的第一个字符的索引位置3。
🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。