Skip to content

Instantly share code, notes, and snippets.

@GUIEEN
Created April 9, 2020 03:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save GUIEEN/9f3c38f5dff0e7c0252ed19acb74c1f0 to your computer and use it in GitHub Desktop.
Save GUIEEN/9f3c38f5dff0e7c0252ed19acb74c1f0 to your computer and use it in GitHub Desktop.
leetcode
/**
* @param {string} s
* @param {string} p
* @return {boolean}
*/
let isMatch = function (s, p, shouldHide) {
function Logger() {
this.hide = false;
this.log = (...args) => {
if (!this.hide) {
console.log(args);
}
};
}
let logger = new Logger();
logger.hide = shouldHide;
// base condition
if (s.length === 0) {
if (p.length === 0) {
return true;
}
return false;
}
let prev = null,
// nextCoord = null,
cur = p[0],
wasStar = false,
j = 0,
needFurtherCheck = true;
function comparer(target, i) {
logger.log('βœ… started cur:: ', cur);
if (target === cur || cur === '.') {
logger.log('πŸ‘‰ 2');
if (cur !== '*') {
prev = cur;
}
if (j === p.length - 1 && i === s.length - 1) {
logger.log('πŸ‘‰ 2-0');
needFurtherCheck = false;
return true;
}
j++;
if (j >= p.length) {
logger.log('πŸ‘‰ 2-1');
return false;
}
cur = p[j];
if (cur === '*') {
// prev doesn't change
wasStar = true;
} else {
wasStar = false;
prev = null;
}
return true;
} else if (cur === '*') {
logger.log('πŸ‘‰ 3');
if (prev === '.' || target === prev) {
logger.log('πŸ‘‰ 3-1');
return true;
}
}
logger.log('πŸ‘‰ 1-1');
if (j + 1 < p.length && (p[j + 1] === '*' || wasStar)) {
logger.log('πŸ‘‰ 1-2');
if (cur !== '*') {
prev = cur;
}
j++;
if (j >= p.length) {
logger.log('πŸ‘‰ 1-3');
return false;
}
cur = p[j];
if (cur === '*') {
// prev doesn't change
wasStar = true;
} else {
wasStar = false;
prev = null;
}
return comparer(target, i);
} else {
logger.log('πŸ‘‰ 1-4');
return false;
}
}
for (let i = 0; i < s.length; i++) {
let target = s[i];
logger.log('-----------------------------------', i);
logger.log(i, target, prev, cur);
let result = comparer(target, i);
logger.log(i, target, prev, cur, result);
logger.log('----------------------------------- done');
if (result) {
// do nothing
} else {
return false;
}
}
if (needFurtherCheck && j < p.length) {
logger.log(s, p);
logger.log('----- j : ', cur, j, p.length);
logger.log(p[j + 1], s[s.length - 1]);
while (j < p.length) {
if (cur === '*') {
if (j + 1 === p.length) {
return true;
}
cur = p[++j];
logger.log('cur :: ', cur);
logger.log('s[s.length - 1] :: ', s[s.length - 1]);
if (cur === s[s.length - 1]) {
return true;
} else {
return false;
}
} else {
return false;
}
j++;
}
}
logger.log(j, p[j]);
return true;
};
console.log(
'\n===================================================================\n===================================================================\n',
);
let result = isMatch('aab', 'c*a*b', true);
console.log(`isMatch('aab', 'c*a*b') :: `, result, ` isCorrect: ${true === result ? 'βœ…' : '❌'}`); // true
// console.log(isMatch('aa', 'a')); // false
result = isMatch('ab', '.*c', false);
console.log(`isMatch('ab', '.*c') :: `, result, ` isCorrect: ${false === result ? 'βœ…' : '❌'}`); // false
result = isMatch('aaa', 'a*a', true);
console.log(`isMatch('aaa', "a*a") :: `, result, ` isCorrect: ${true === result ? 'βœ…' : '❌'}`); // true
result = isMatch('aaa', 'aaaa', true);
console.log(`isMatch('aaa', "aaaa") :: `, result, ` isCorrect: ${false === result ? 'βœ…' : '❌'}`); // true
result = isMatch('aa', 'a*', false);
console.log(`isMatch('aa', 'a*') :: `, result, ` isCorrect: ${true === result ? 'βœ…' : '❌'}`); // true
result = isMatch('aaa', 'ab*a*c*a', false);
console.log(`isMatch('aaa', 'ab*a*c*a') :: `, result, ` isCorrect: ${true === result ? 'βœ…' : '❌'}`); // true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment