题目传送门
题目分析
1.这个题目如果直接暴力那么时间复杂度太大,那么我们可以用优化方法,直接跳转到后面的字符一一比较,只要有一个不符合,那么就return 0;
2.我们开两个数组,用last数组不断地更新a字符串每个位置的字母,再把它赋给二维数组nec,我们用nec数组来记录每一个字母后面字母出现的相应位置
3.为什么要从后面开始遍历,以为这样非常方便的更新last数组的值,每往前一位,就再次重新赋给当前的nec数组
4.如果匹配的时候,没有与比较字符相同的,那么当前位置所存贮的数就是-1,我们就直接返回0
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
char a[maxn], b[maxn];
int n, last[30], nec[maxn][30];
void deal()