ধরুন আমাদের একটি ইনপুট স্ট্রিং str এবং একটি প্যাটার্ন p দেওয়া হয়েছে, আমাদেরকে সমর্থনের সাথে নিয়মিত এক্সপ্রেশন ম্যাচিং বাস্তবায়ন করতে হবে। এবং *।
এই চিহ্নগুলির ফাংশন −
হওয়া উচিত-
. --> যেকোন একক অক্ষর মেলে।
-
* --> পূর্ববর্তী উপাদানগুলির সাথে শূন্য বা তার বেশি মেলে।
মিলটি সম্পূর্ণ ইনপুট স্ট্রিংকে কভার করতে হবে (আংশিক নয়)।
দ্রষ্টব্য
-
str খালি হতে পারে এবং শুধুমাত্র ছোট হাতের অক্ষর a-z ধারণ করে।
-
p খালি হতে পারে এবং শুধুমাত্র ছোট হাতের অক্ষর a-z এবং এর মতো অক্ষর ধারণ করে। অথবা *।
উদাহরণস্বরূপ -
যদি ইনপুট হয় −
const str = 'aa'; const p = 'a';
তারপর আউটপুট মিথ্যা হওয়া উচিত কারণ a পুরো স্ট্রিং aa এর সাথে মেলে না।
উদাহরণ
নিম্নলিখিত কোড -
const regexMatching = (str, p) => {
const ZERO_OR_MORE_CHARS = '*';
const ANY_CHAR = '.';
const match = Array(str.length + 1).fill(null).map(() => {
return Array(p.length + 1).fill(null);
});
match[0][0] = true;
for (let col = 1; col <= p.length; col += 1) {
const patternIndex = col - 1;
if (p[patternIndex] === ZERO_OR_MORE_CHARS) {
match[0][col] = match[0][col - 2];
} else {
match[0][col] = false;
}
}
for (let row = 1; row <= str.length; row += 1) {
match[row][0] = false;
}
for (let row = 1; row <= str.length; row += 1) {
for (let col = 1; col <= p.length; col += 1) {
const stringIndex = row - 1;
const patternIndex = col - 1;
if (p[patternIndex] === ZERO_OR_MORE_CHARS) {
if (match[row][col - 2] === true) {
match[row][col] = true;
} else if (
(
p[patternIndex - 1] === str[stringIndex]
|| p[patternIndex - 1] === ANY_CHAR
)
&& match[row - 1][col] === true
) {
match[row][col] = true;
} else {
match[row][col] = false;
}
} else if (
p[patternIndex] === str[stringIndex]
|| p[patternIndex] === ANY_CHAR
) {
match[row][col] = match[row - 1][col - 1];
} else {
match[row][col] = false;
}
}
}
return match[str.length][p.length];
};
console.log(regexMatching('aab', 'c*a*b')); আউটপুট
নিম্নোক্ত কনসোলে আউটপুট -
true