【发布时间】:2020-04-29 10:22:26
【问题描述】:
问题:给定一个文本 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;
}
【问题讨论】:
-
为什么您认为您的代码有问题?为什么在 C++ 中使用 C 字符串?
-
嘿兔子,请查看how to ask a good question 并尝试相应地改进您的问题。特别是,“谁能告诉我出了什么问题” 非常不具体,而且您的问题至少缺少对您遇到的问题的清晰描述。此外,您当前的输出加上您期望的输出和所有错误消息(如果有)会有所帮助。
-
代码中的第一个问题是访问
hashpat和hashtxt数组的方式。您直接使用char值来索引 26 大小的整数数组。使用hashpat[pat[i]-'A']而不是hashpat[pat[i]]来进行正确的索引。另外,在其他地方也解决这个问题。您的代码中可能存在其他逻辑错误。