2022华为机试真题 C++ 实现 字符串子序列II

Posted MISAYAONE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022华为机试真题 C++ 实现 字符串子序列II相关的知识,希望对你有一定的参考价值。

目录

题目

思路

核心考点

Code


题目

给定字符串 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)

2022华为机试真题 C++ 实现非严格递增连续数字序列

华为机试真题 C++ 实现对称美学2022.11 Q4 新题

华为机试真题 C++ 实现过滤组合字符串2022.11 Q4新题

华为OD机试真题Java实现最长连续子串真题+解题思路+代码(2022&2023)

2022华为机试真题 C++ 实现找朋友