কম্পিউটার টিউটোরিয়াল

ওয়াইল্ডকার্ড প্যাটার্ন ম্যাচিং (Wildcard Pattern Matching)

এই সমস্যায় একটি মূল স্ট্রিং এবং একটি ওয়াইল্ডকার্ড প্যাটার্ন দেওয়া থাকে। এই অ্যালগরিদমে চেক করা হবে ওয়াইল্ডকার্ড প্যাটার্নটি মূল টেক্সটের সাথে মিলে যাচ্ছে কিনা।

ওয়াইল্ডকার্ড প্যাটার্নে অক্ষর, '*' বা '?' চিহ্ন থাকতে পারে। '?' একক ক্যারেক্টার মিলানোর জন্য ব্যবহৃত হয় এবং '*' খালি স্থানসহ ক্যারেক্টার সিকোয়েন্স মিলানোর জন্য।

  • যখন ক্যারেক্টার '*' হয়: তারকা ক্যারেক্টারটি উপেক্ষা করে প্যাটার্নের পরবর্তী ক্যারেক্টার চেক করতে পারি।
  • যখন পরবর্তী ক্যারেক্টার '?' হয়, তবে টেক্সটের বর্তমান ক্যারেক্টারটি উপেক্ষা করে প্যাটার্ন এবং টেক্সটের পরবর্তী ক্যারেক্টার চেক করতে পারি।
  • যখন প্যাটার্ন ক্যারেক্টার '*' এবং '?' ব্যতীত অন্য কিছু হয়, তবে প্যাটার্ন এবং টেক্সটের বর্তমান ক্যারেক্টার মিললে আগে যেতে পারি।

ইনপুট এবং আউটপুট

ইনপুট: মূল স্ট্রিং এবং ওয়াইল্ডকার্ড প্যাটার্ন।
Main String: "Algorithm"
Pattern: "A*it?m"

আউটপুট: প্যাটার্ন মিলেছে।

অ্যালগরিদম

wildcardMatch(text, pattern)

ইনপুট: মূল টেক্সট এবং প্যাটার্ন।
আউটপুট: মূল টেক্সটের জন্য ওয়াইল্ডকার্ড প্যাটার্ন মিললে true।

শুরু
  n := টেক্সটের দৈর্ঘ্য
  m := প্যাটার্নের দৈর্ঘ্য
  যদি m = 0 হয়, তবে
    n = 0 হলে ০ ফেরত দিন, অন্যথায় ১
  i := 0, j := 0
  i < n পর্যন্ত, করুন
    যদি text[i] == pattern[j] হয়, তবে
      i ১ বৃদ্ধি করুন
      j ১ বৃদ্ধি করুন
    অন্যথায় যদি j < m এবং pattern[j] '?' হয়, তবে
      i ১ বৃদ্ধি করুন
      j ১ বৃদ্ধি করুন
    অন্যথায় যদি j < m এবং pattern[j] '*' হয়, তবে
      textPointer := i
      patPointer := j
      j ১ বৃদ্ধি করুন
    অন্যথায় যদি patPointer ইতিমধ্যে আপডেটেড থাকে, তবে
      j := patPointer + 1
      i := textPointer + 1
      textPointer ১ বৃদ্ধি করুন
    অন্যথায়
      ফেরত দিন false
  শেষ
  j < m এবং pattern[j] = '*' পর্যন্ত, করুন
    j ১ বৃদ্ধি করুন
  শেষ
  যদি j = m হয়, তবে
    ফেরত দিন true
  ফেরত দিন false
শেষ

উদাহরণ (C++)

#include <iostream>
using namespace std;

bool wildcardMatch(string text, string pattern) {
  int n = text.size();
  int m = pattern.size();
  if (m == 0)
    return (n == 0);
  int i = 0, j = 0, textPointer = -1, pattPointer = -1;
  while (i < n) {
    if (text[i] == pattern[j]) {
      i++; j++;
    } else if (j < m && pattern[j] == '?') {
      i++; j++;
    } else if (j < m && pattern[j] == '*') {
      textPointer = i;
      pattPointer = j;
      j++;
    } else if (pattPointer != -1) {
      j = pattPointer + 1;
      i = textPointer + 1;
      textPointer++;
    } else
      return false;
  }
  while (j < m && pattern[j] == '*')
    j++;
  if (j == m)
    return true;
  return false;
}

int main() {
  string text, pattern;
  cout << "Enter Text: "; cin >> text;
  cout << "Enter wildcard pattern: "; cin >> pattern;
  if (wildcardMatch(text, pattern))
    cout << "Pattern Matched." << endl;
  else
    cout << "Pattern is not matched" << endl;
}

আউটপুট

Enter Text: Algorithm
Enter wildcard pattern: A*it?m
Pattern Matched.
  1. ম্যাক্সিমাম বাইপার্টাইট ম্যাচিং (Maximum Bipartite Matching)

  2. পাইথনে Unix ফাইলনেম প্যাটার্ন ম্যাচিং (fnmatch)

  3. পাইথনে ইউনিক্স ফাইলনেম প্যাটার্ন ম্যাচিং

  4. রুবি প্যাটার্ন ম্যাচিং মাস্টার: একটি প্র্যাকটিক্যাল গাইড