标题:寻找相同子串 | 时间限制:1秒 | 内存限制:65536K | 语言限制:不限 给你两个字符串 t 和 p ,要求从 t 中找到一个和 p 相同的连续子串,并输出该字串第一个字符的下标。 输入描述: 输入文件包括两行,分别表示字符串 t 和 p ,保证 t 的长度不小于 p ,且 t 的长度不超过1000000,p 的长度不超过10000。 输出描述: 如果能从 t 中找到一个和 p 相等的连续子串,则输出该子串第一个字符在t中的下标(下标从左到右依次为1,2,3,…);如果不能则输出”No”;如果含有多个这样的子串,则输出第一个字符下标最小的。 示例1 输入 AVERDXIVYERDIAN RDXI 输出 4
时间: 2023-05-19 14:00:34 浏览: 159
这是一个字符串匹配问题,可以使用 KMP 算法来解决。以下是示例代码:
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1000005;
const int MAXM = 10005;
char t[MAXN], p[MAXM];
int nxt[MAXM];
void get_next() {
int i = 0, j = -1;
nxt[0] = -1;
while (i < strlen(p)) {
if (j == -1 || p[i] == p[j]) {
i++;
j++;
nxt[i] = j;
} else {
j = nxt[j];
}
}
}
int kmp() {
int i = 0, j = 0;
while (i < strlen(t) && j < strlen(p)) {
if (j == -1 || t[i] == p[j]) {
i++;
j++;
} else {
j = nxt[j];
}
}
if (j == strlen(p)) {
return i - j + 1;
} else {
return -1;
}
}
int main() {
cin >> t >> p;
get_next();
int pos = kmp();
if (pos == -1) {
cout << "No" << endl;
} else {
cout << pos << endl;
}
return 0;
}
对于编程类的问题,我可以回答,不过我并不是一个真正的 ChatGPT AI,只是一个程序,无法像 ChatGPT 那样理解自然语言并进行智能回答。
阅读全文