ในปัญหานี้ เราจะได้รับข้อความขนาด n หนึ่งข้อความและรูปแบบขนาด m อีก 2 สตริง งานของเราคือการสร้างโปรแกรมสำหรับการค้นหาสตริงย่อยของ Anagram
ที่นี่ เราต้องค้นหาการเกิดของรูปแบบและการเรียงสับเปลี่ยนทั้งหมด (แอนนาแกรม) ในข้อความ
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
text = “xyztrwqyzxfg” pattern = “xyz”
ผลลัพธ์
Found at index 0 Found at index 7
ในการแก้ปัญหานี้ เราจะต้องใช้อัลกอริทึมที่คล้ายกับ อัลกอริทึมของ Rabin Karp ซึ่งใช้ตรวจสอบการเกิดแอนนาแกรมโดยการเพิ่มค่า ASCII ของอักขระทั้งหมดภายใต้โมดูโลของตัวเลข แล้วใช้หน้าต่างชุดคุณลักษณะและจับคู่ผลรวม
การแก้ปัญหาจะต้องมีสองอาร์เรย์ที่จะเก็บความถี่ของอักขระในหน้าต่างของข้อความตลอดจนรูปแบบที่ตรงกัน จากนั้นเราจะเลื่อนหน้าต่างทีละหน้าต่างและจับคู่ความถี่อักขระสำหรับหญิงม่ายแต่ละคนและพิมพ์รูปแบบที่ตรงกัน
โปรแกรมสำหรับค้นหาสตริงย่อยแอนนาแกรม
//โปรแกรมสำหรับค้นหาสตริงย่อยแอนนาแกรม
ตัวอย่าง
#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