I do not know how to solve this coding puzzle with Javascript. I've never been working with Regular Expressions but I feel they are the best approach to solve it.
Let's say, I have this code:
let str = "abcdefabc";
let pattern = "abc";
What I need is to write the algorithm, that returns the array of arrays (two-dimensional) of indexes like this:
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
where indexes are the positions of pattern
letters in str
. For example, with str = 'abcdefabc'
and pattern pattern = 'abc'
algo must return such arrays:
[0, 1, 2]
(first'abc'
inside str that matchespattern
: "abcdefabc");[6, 7, 8]
(last'abc'
inside str that matchespattern
: "abcdefabc"); these are obvious examples, but it must return those as well:[0, 1, 8]
because "abcdefabc"[0, 7, 8]
because "abcdefabc"
I hope you got the logic. The order of pattern
is important: str = 'fox1423423man_united_x'
with pattern ='fox'
must return [[0, 1, 2], [0, 1, 21]]
;
str = 'google
with pattern ='fox'
must return null
because there is no 'fox' somewhere in between;
str = 'xof'
with pattern ='fox'
must return null
because the way the letters go is important;
All strings will be lower-case
CodePudding user response:
Here's a solution that solves it via recursion.
It uses the old indexOf to find the positions of the characters.
function findTokenPositions(str, tokens) {
let arr = [];
function recurse (strpos=0, tok=0, accum=[]) {
if (tok >= tokens.length) { arr.push(accum); return; }
strpos = str.indexOf(tokens[tok], strpos);
if (strpos < 0) { return; }
accum[tok] = strpos;
recurse(strpos 1, tok 1, [...accum])
recurse(strpos 1, tok, [...accum]);
}
recurse(0, 0);
return arr;
}
let tests = [
["abcdefabc", "abc"],
["fox1423423man_united_x", "fox"],
["hound", "fox"]
];
tests.forEach(x => {console.log(x[0] ':' x[1] '-->' JSON.stringify(findTokenPositions(x[0], x[1])))});