统计一致字符串的数目
题目
1684. 统计一致字符串的数目 - 力扣(LeetCode)
给定一个由不同字符组成的字符串 allowed
和一个字符串数组 words
,如果一个字符串的每一个字符都在 allowed
中,就称这个字符串是一致字符串。请你返回 words
数组中一致字符串的数目。
示例 1:
1 | 输入:allowed = "ab", words = ["ad","bd","aaab","baa","badab"] |
示例 2:
1 | 输入:allowed = "abc", words = ["a","b","c","ab","ac","bc","abc"] |
示例 3:
1 | 输入:allowed = "cad", words = ["cc","acd","b","ba","bac","bad","ac","d"] |
提示:
1 <= words.length <= 10^4
1 <= allowed.length <= 26
1 <= words[i].length <= 10
allowed
中的字符 互不相同 。words[i]
和allowed
只包含小写英文字母。
1 | class Solution { |
解题
字符集合的位表示
由于题目中说明字符串仅包含小写字母,我们可以使用位运算来表示字符串的字母集合。
通过一个 32 位整数mask
来表示一个字符串的字母集合,其中每一位表示一个字母是否出现(如果一个字母出现了,那么将对应整数的位设1,否则就是0)。
构建 allowed 的字母集合 mask
首先,我们需要构建字符串 allowed
中出现的字母集合 mask
。遍历 allowed
中的每个字符,将对应字母的二进制位置设为 1,得到一个整数 mask
,表示 allowed
中出现的字母集合。
1 | int mask = 0; |
遍历 words 数组,统计一致字符串的数目
然后,我们遍历 words
数组,对于每个字符串 word
,构建其字母集合 mask1
,并通过 (mask1 | mask) == mask
判断 mask1
是否是 mask
的子集,如果是,则说明该字符串是一致字符串,将结果 res
增加。
1 | int res = 0; |
最后,返回统计得到的一致字符串的数目。
完整代码
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 翼同学的个人博客!
评论
ValineDisqus