मान लीजिए हमें एक इनपुट स्ट्रिंग str और एक पैटर्न p दिया गया है, हमें . और * के समर्थन के साथ नियमित अभिव्यक्ति मिलान लागू करना आवश्यक है।
इन प्रतीकों के कार्य होने चाहिए -
- . --> किसी भी एकल वर्ण से मेल खाता है।
- * --> पूर्ववर्ती तत्व के शून्य या अधिक से मेल खाता है।
मिलान को संपूर्ण इनपुट स्ट्रिंग को कवर करना चाहिए (आंशिक नहीं)।
नोट
- str खाली हो सकती है और केवल लोअरकेस अक्षर a-z रखती है।
- p खाली हो सकती है और केवल लोअरकेस अक्षर a-z, और . या * जैसे वर्ण रखती है।
उदाहरण के लिए -
यदि इनपुट है -
const str = 'aa'; const p = 'a';
तो आउटपुट false होना चाहिए क्योंकि 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