C# fast and pretty simple hashmap, BinarySearch | 173ms 100%
\npublic class Solution {\n    public int NumMatchingSubseq(string s, string[] words) {\n        \n        // For charToIndexes[] it is possible to use 26 array
```\npublic class Solution {\n    public int NumMatchingSubseq(string s, string[] words) {\n        \n        // For charToIndexes[] it is possible to use 26 array\'s length, \n        // but in the case 128 length there is no need to normilize \n        // char\'s index like  chIds = ch - \'a\'. It reduces extra operations.\n        // The 128 length is covering max possible index of \'z\': 122\n        var (count, charToIndexes) = (0, new List<int> [128]);\n        \n        // For each letter in the large string create list of it\'s indexes\n        for(var ch = \'a\'; ch <= \'z\'; ch++)\n            charToIndexes[ch] = new List<int>();\n        \n        for(var i=0; i<s.Length; i++)\n            charToIndexes[s[i]].Add(i);\n        \n        foreach(var w in words)\n        {\n            var currentIndex = -1;\n            \n            for(var i=0; i< w.Length && currentIndex >= -1; i++)\n            {\n                // If list is empty then BinarySearch fallback to not find cases.\n                var charIndexes = charToIndexes[w[i]];\n                \n                var idx = charIndexes.BinarySearch(currentIndex);\n                \n                // Check the C# BinarySearch return interpretations.\n                if(idx < 0 && (idx = ~idx /* get value */) == charIndexes.Count)\n                {\n                    currentIndex = int.MinValue; // Not found -> break cycle\n                }\n                else\n                {\n                    // next char will be expected \n                    // at least +1 index from found current char\n                    currentIndex = charIndexes[idx]+1; \n                }\n            }\n\n            count += (currentIndex >= 0) ? 1 : 0;\n        }\n     \n        return count;\n    }\n}\n```
[]