问题:给定文本txt [0..n-1]和模式pat [0..m-1],编写一个函数search(char pat [],char txt []),该函数会打印所有出现的pat []及其在txt []中的排列(或字谜)。您可以假设n> m。
#include<iostream>
#include<cstring>
#define MAX 256
using namespace std;
void search(char *pat, char *txt)
{
int M = strlen(pat), N = strlen(txt);
int i,count=0,start=0 ;
int hashpat[26]={0},hashtxt[26]={0};
for(i=0;i<M;i++)
{
hashpat[pat[i]]++;
}
for(i=0;i<N;i++)
{
hashtxt[txt[i]]++;
if(hashtxt[txt[i]]<=hashpat[txt[i]])
count++;
if(count==M)
{ cout<<"Found at index"<<i-M<<"\n";
hashtxt[txt[start]]--;
if(hashpat[txt[start]]!=0) count--;
start++;
}
}
}
/* Driver program to test above function */
int main()
{
char txt[] = "BACDGABCDA";
char pat[] = "ABCD";
search(pat, txt);
return 0;
}
您尚未描述您所遇到的实际问题,因此我不会检查您的代码是否满足该问题。但是,至少有一个明显的缺陷。
A char
是一个字节,可以保存0-255之间的数字。大写字母的范围为65-90(*),例如参见this page。因此pat
实际上看起来像这样:{65, 66, 67, 68}
。
您正在尝试使用这些数字输入hashpat
,这些数字远大于数组的长度。您需要将它们的大小分配为256,这已经很方便了,您已经具有定义。
int hashpat[MAX]={0};
int hashtxt[MAX]={0};
一些其他随机建议:
char*
,您可能应该制作这些char
数组。search
的参数和main
中的变量都应为const char*
,因为这是字符串文字的类型vector
和string
而不是数组和字符,这通常会使事情变得容易一些。(*)假设我们使用的是ASCII / UTF-8,但这又是另一回事。