2022华为机试真题 C++ 实现 字符串子序列II
Posted MISAYAONE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022华为机试真题 C++ 实现 字符串子序列II相关的知识,希望对你有一定的参考价值。
目录
题目
给定字符串 target 和 source,判断 target是否为 source 的子序列。你可以认为target和 source 中仅包含英文小写字母。
字符串 source 可能会很长(长度~=500,000),而 target是个短字符串(长度<=100)。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。
(例如,”abc”是”aebycd”的一个子序列,而”ayb”不是)。
请找出最后一个子序列的起始位置。
输入描述:
第一行为target,短字符串(长度 <=100)
第二行为source,长字符串(长度 ~= 500,000)输出描述:
最后一个子序列的起始位置,即最后一个子序列首字母的下标
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
abc
abcaybec
说明
这里有两个abc的子序列满足,取下标较大的,故返回3。
备注:
若在source中找不到target,则输出-1。
思路
1:经典的双指针法,既然要找最后一个子序列,那么就分别从 target 和 source 的末尾往前遍历即可,如果指针所指位置字符相等,两个指针都左移一位,否则只将source指针左移一位,直到target的指针指向头部结束。复杂度O(n^2)
2:记得最后找不到 target,需要返回 -1.
核心考点
1:双指针法
2:字符串匹配
Code
#include<iostream>
using namespace std;
int main()
string target = "abc";
string source = "abcaybec";
//cin >> target;
//cin >> source;
//定义两个尾部指针
int i = target.size() - 1;
int j = source.size() - 1;
while (i >= 0 && j >= 0)
// 两个位置上字符相等
if (target[i] == source[j])
// target字符串已经到达头部时,找到目标位置
if (i == 0)
cout << j << endl;
return 0;
i--;
j--;
// 找不到的话返回 -1
cout << -1 << endl;
以上是关于2022华为机试真题 C++ 实现 字符串子序列II的主要内容,如果未能解决你的问题,请参考以下文章
华为OD机试真题Java实现找出符合要求的字符串子串真题+解题思路+代码(2022&2023)
华为机试真题 C++ 实现对称美学2022.11 Q4 新题
华为机试真题 C++ 实现过滤组合字符串2022.11 Q4新题