Here's one algorithm that benefits from "early failures", as soon as a letter in the second word is processed for which there's no corresponding letter in the first word, it returns. It's also using an array to count, not a hash.
It's a small (and untested) subroutine. The benefit of using an array, and splitting on an empty regex is that it can be ported to C trivially. If speed is really important, I'd consider using Inline::C.sub match { my @h; ++ $h [ord] for split // => shift; -- $h [ord] < 0 and return for split // => shift; 1; }
Note also that you could archieve major speedup by not calling the match function a million times - instead call it with a list of pairs of arguments to process. Calling a function is not a cheap task. However, you need to be careful and not kill the gained performance by using too much memory.
Abigail
In reply to Re: Finding One String in Another
by Abigail-II
in thread Finding One String in Another
by Fideist11
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |