-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path10-regularExpressionMatching.js
More file actions
124 lines (98 loc) · 2.31 KB
/
10-regularExpressionMatching.js
File metadata and controls
124 lines (98 loc) · 2.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
var isMatch = function (s, p) {
let a = 0;
let b = 0;
let lastMatch = {};
const patternTransform = transformPatternString(p);
const noStars = patternTransform.filter((patternObj) => !patternObj.star);
let cont = true;
if (noStars.length && !preliminaryCheck(s, noStars)) return false;
while (cont) {
const stringLetter = s[a];
let patternObj = patternTransform[b];
console.log(stringLetter);
console.log(patternObj);
console.log(a, b);
if (!patternObj) {
return a === s.length;
}
if (
patternObj.letter === lastMatch.letter &&
!patternObj.star &&
lastMatch.star
) {
b++;
continue;
}
if (!stringLetter) {
return checkRemainingPatternsObjects(
patternTransform,
b,
lastMatch
);
}
const checkResult = checkLetterMatch(stringLetter, patternObj);
if (checkResult) {
if (a < s.length) a++;
if (!patternObj.star) b++;
lastMatch = {
letter: stringLetter,
star: patternObj.star,
};
} else {
if (!patternObj.star) {
cont = false;
} else {
b++;
}
}
}
return a === s.length && b === patternTransform.length;
};
function checkLetterMatch(stringLetter, patternObj) {
if (!stringLetter) return false;
if (stringLetter === patternObj.letter || patternObj.letter === ".")
return true;
return 0;
}
function transformPatternString(p) {
const arrayOfLetters = Array.from(p);
const result = [];
for (let i = 0; i < arrayOfLetters.length; i++) {
const letter = arrayOfLetters[i];
let star = false;
if (letter === "*") continue;
if (arrayOfLetters[i + 1] === "*") star = true;
result.push({
letter,
star,
});
}
return result;
}
function checkRemainingPatternsObjects(patternTransform, b, lastMatch) {
for (let i = b; i < patternTransform.length; i++) {
if (patternTransform[i].star === false) {
if (
(lastMatch.letter === patternTransform[i].letter ||
patternTransform[i].letter === ".") &&
lastMatch.star
) {
continue;
} else return false;
}
}
return true;
}
function preliminaryCheck(s, noStars) {
let a = 0;
let b = 0;
while (true) {
if (a === s.length || b === noStars.length) break;
if (s[a] === noStars[b].letter || noStars[b].letter === ".") {
b++;
}
a++;
}
return b === noStars.length;
}
console.log(isMatch("aasdfasdfasdfasdfas", "aasdf.*asdf.*asdf.*asdf.*s"));