代码:
#include<cstdio>
#include<cstdlib>
#include<string>
#include<iostream>
using namespace std;
class KMP {
public:
int * prefix_array(string);
bool kmp_search(string,string,int *);
};
int * KMP::prefix_array(string pattern) {
int m,q,k;
int *a;
string p;
p=pattern;
m = p.length();
a = (int*)malloc(sizeof(int)*m);
a[0] = -1;
k=-1;
for(q=1;q<m;q++) {
while(k>-1 && p[k+1] != p[q]) {
k=a[k];
}
if(p[k+1]==p[q]) {
k=k+1;
}
a[q]=k;
}
/*
for(int i=0;i<m;i++) {
printf("%d ",a[i]);
}
printf("\n");
*/
return a;
}
bool KMP::kmp_search(string str, string pattern,int *a) {
int n,m,q,i;
string S,p;
S = str;
p = pattern;
n = str.length();
m = pattern.length();
q = -1;
for(i=0;i<n;i++) {
while(q>-1 && p[q+1] != S[i]) {
q=a[q];
}
if(p[q+1] == S[i]) {
q=q+1;
}
if(q==m-1) {
q=a[q];
return true;
}
}
return false;
}
int main() {
//freopen("in.txt","r",stdin);
int testCase,num;
char ch;
string str,pattern;
char str2[250];
bool check;
int *arr;
KMP *obj = new KMP();
scanf("%d\n",&testCase);
while(testCase--) {
getline(cin,str);
//cout<<str<<endl;
scanf("%d\n",&num);
//printf("%d\n",num);
while(num--) {
getline(cin,pattern);
arr=obj->prefix_array(pattern);
check = obj->kmp_search(str,pattern,arr);
if(check) {
printf("y\n");
} else {
printf("n\n");
}
}
}
delete obj;
return 0;
}
in.txt(输入):
2
abcdefghABCDEFGH
3
ababaca
abc
abAB
xyz
1
xyz
我试图在int * KMP::prefix_array(string pattern) {
中释放记忆。
它使用以下内容分配内存:a = (int*)malloc(sizeof(int)*m);
,此函数返回指针。那我怎么能释放那段记忆呢?
任何答案都将受到高度赞赏。提前谢谢。
答案 0 :(得分:1)
返回已分配指针的函数表示该内存的所有权正在传输给该函数的调用者。接收返回指针的代码取决于释放内存。
虽然在C ++中使用malloc()
和free()
并非完全没有先例,但通常应避免使用它。您可以通过更改代码以使用std::vector<int>
而不是int *
来完全避免此问题。