Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

아나그램 부분 문자열 검색을 위한 C 프로그램

<시간/>

이 문제에서는 크기가 n인 텍스트와 크기가 m인 패턴 두 개의 문자열이 제공됩니다. 우리의 임무는 Anagram 부분 문자열 검색을 위한 프로그램을 만드는 것입니다.

여기서 우리는 텍스트에서 패턴의 모든 발생과 모든 순열(아나그램)을 찾아야 합니다.

문제를 이해하기 위해 예를 들어보겠습니다.

입력

text = “xyztrwqyzxfg” pattern = “xyz”

출력

Found at index 0
Found at index 7

이 문제를 해결하려면 Rabin Karp 알고리즘과 유사한 알고리즘을 사용해야 합니다. 숫자의 모듈로 아래 모든 문자의 ASCII 값을 추가하여 아나그램 발생 여부를 확인하는 데 사용됩니다. 그런 다음 특성 세트 창을 사용하고 합계를 일치시킵니다.

솔루션에는 텍스트 창의 문자 빈도와 일치하는 패턴을 저장할 두 개의 배열이 필요합니다. 그런 다음 창을 하나씩 슬라이드하고 각 창의 문자 빈도를 일치시키고 일치하는 패턴의 인쇄를 인쇄합니다.

Anagram 부분 문자열 검색을 위한 프로그램

//애너그램 부분 문자열 검색을 위한 프로그램

예시

#include <cstring>
#include <iostream>
#define MAX 256
using namespace std;
bool matchPattern(char arr1[], char arr2[]){
   for (int i = 0; i < MAX; i++)
   if (arr1[i] != arr2[i])
      return false;
   return true;
}
void anagramSearch(char* pattern, char* text){
   int M = strlen(pattern);
   int N = strlen(text);
   char patternArray[MAX] = { 0 }, textArray[MAX] = { 0 };
   for (int i = 0; i < M; i++) {
      (patternArray[pattern[i]])++;
      (textArray[text[i]])++;
   }
   for (int i = M; i < N; i++) {
      if (matchPattern(patternArray, textArray))
         printf("\nPattern found at index value : %d", (i-M));
      (textArray[text[i]])++;
      textArray[text[i - M]]--;
   }
   if (matchPattern(patternArray, textArray))
   printf("\nPattern found at index value: %d", (N-M));
}
int main() {
   char text[] = "xyztrwqyzxfg";
   char pattern[] = "xyz";
   printf("Searching Anagram pattern in the string ");
   anagramSearch(pattern, text);
   return 0;
}

출력

Searching Anagram pattern in the string
Pattern found at index value: 0
Pattern found at index value: 7