■ 题目描述
【字符串子序列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。
解题思路:从右边往左边找(起点应该为len2 - len1),如果找到则是最大下标。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str1[101] = {0};
char str2[500001] = {0};
gets(str1);
gets(str2);
int len1 = strlen(str1);
int len2 = strlen(str2);
if (len2 < len1) {
printf("len err\n");
return -1;
}
int idx_1;
for (int i = len2-len1; i >= 0; i--) {
idx_1 = 0;
if (str2[i] != str1[idx_1]) {
continue;
}
idx_1++;
if (idx_1 > len1) {
continue;
}
int idx_2 = i + 1;
while (idx_2 < len2 && idx_1 < len1) {
if (str1[idx_1] == str2[idx_2]) {
idx_1++;
}
idx_2++;
if (idx_1 == len1) {
printf("%d\n", i);
return 0;
}
}
}
printf("-1\n");
return 0;
}