Может ли кто-нибудь сказать мне, что не так с моим кодом C ++? - PullRequest
0 голосов
/ 12 января 2020

вопрос: учитывая текст txt [0..n-1] и шаблон pat [0..m-1], напишите функцию поиска (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; 
}

1 Ответ

1 голос
/ 16 января 2020

Вы не описали реальную проблему, с которой вы столкнулись, и я не буду go проходить и проверять, удовлетворяет ли ваш код этой проблеме. Однако есть по крайней мере один очевидный недостаток.

A char - это один байт, который может содержать числа от 0 до 255. Заглавные буквы занимают диапазон 65-90 (*), см. Например эту страницу . Так что pat на самом деле выглядит так: {65, 66, 67, 68}.

Вы пытаетесь ввести в hashpat эти числа, которые намного больше, чем длина массива. Вы должны распределить их по размеру 256, что удобно использовать в качестве определения.

int hashpat[MAX]={0};
int hashtxt[MAX]={0};

Несколько других случайных советов:

  • Учитывая, что вы передаете char*, вы, вероятно, должны сделать эти char массивы.
  • И аргументы search, и переменные в main должны быть const char*, так как это тип строковых литералов
  • Учитывая, что вы используете C ++, вы должны рассмотреть возможность использования vector и string вместо массивов и символов, что, как правило, делает все немного проще.

(*) Предполагая, что мы в ASCII / UTF-8, но это совсем другой чайник с sh.

...