2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++)
题目描述
输入两个字符串 S 和 L,都只包含英文小写字母。S 长度<=100,L 长度<=500,000。
判定 S 是否是 L 的有效子串。
判定规则:
S 中的每个字符在 L 中都能找到(可以不连续),且 S 在L中字符的前后顺序与 S 中顺序要保持一致。
(例如,S=”ace”是 L=”abcde”的一个子序列且有效字符是 a、c、e,而”aec”不是有效子序列,且有效字符只有 a、e)
输入描述
输入两个字符串 S 和 L,都只包含英文小写字母。S 长度<=100,L 长度<=500,000。
先输入 S,再输入 L,每个字符串占一行。
输出描述
S 串最后一个有效字符在 L 中的位置。(首位从 0 开始计算,无有效字符返回-1)
示例一
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
ace
abcde
输出
4
示例二
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
fgh
abcde
输出
-1
考点
字符串处理
解题思路
1.查找S中的第一个字符在L中的位置p1,若p1存在,然后从L的p1位置之后查找S的第二个字符是否存在;
2.依此类推,直到S中的最后一个字符都在L中存在,则输出其在L中的下标。
代码
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
string L,S;
cin>>S>>L;
int n=S.size();
int pos=-1;
for(int i=0;i<n;i++) {
pos=L.find(S[i], pos+1);
if(pos==L.npos) {
break;
}
}
if(pos==L.npos) {
cout<<-1<<endl;
}else{
cout<<pos<<endl;
}
system("pause");
return 0;
}
python
#include <bits/stdc++.h>
using namespace std;
int main() {
string L