首页 新闻 会员 周边 捐助

运行时提示string subscript of range

0
[已解决问题] 解决于 2021-06-13 08:05

初学KMP,自己简单的实现了一下,编译没有问题,但是运行时终止了

代码如下:

#include<iostream>
#include<string>
using namespace std;
void GetNext(string& T, int* next)
{
int i = 0;
int j = -1;
next[0] = -1;
int tmp = T.size();
while (i < tmp)
{
	//T[j]为前缀单个字符,T[i]为后缀单个字符
	if ((j == -1) || (T[j] == T[i]))
	{
		++i;
		++j;
		next[i] = j;
	}
	else
	{
		//j回溯
		j = next[j];
	}
}
}

int GetKMP(string& X, string& T)
{
int* next = new int[100];
//i用于主串S当前位置的下标值
int i = 0;
//字串T中当前位置的下标值
int j = 0;
GetNext(T, next);
int tmp1 = T.size();
int tmp2 = X.size();
while ((i < tmp2) && (j < tmp1))
{
	//两字母相等则继续
	if ((j == -1) || (X[i] == T[i]))
	{
		++i;
		++j;
	}
	else
	{
		j = next[j];
	}
}
delete[] next;
if (j == tmp1)
{
	return i - j;
}
else
{
	return -1;
}
}

int main()
{
string X = "abcababca";
string T = "cababc";
cout << GetKMP(X, T) << endl;
return 0;
}

这个错误是要对string初始化吗?可是我在对形参的string初始化:string X=“”之后还是一样,到底是哪出了问题?

FZLS的主页 FZLS | 菜鸟二级 | 园豆:202
提问于:2021-06-12 10:46
< >
分享
最佳答案
0
//两字母相等则继续
	if ((j == -1) || (X[i] == T[i]))

这里的T[ i ] 应该是 T[ j ]:

//两字母相等则继续
	if ((j == -1) || (X[i] == T[j]))
奖励园豆:5
。淑女范erり | 小虾三级 |园豆:961 | 2021-06-12 18:47

感谢,下次一定小心

FZLS | 园豆:202 (菜鸟二级) | 2021-06-13 08:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册