例题
题解
由于 allowed 字符都是不相同的,那么可以取一个 int 类型整数的后 26 位作为标记,比如如果 allowed = “ac” ,那么可以转为一个数:00…000101 (26位),最低位 1 表示 ‘a’ ,另一个 1 表示 ‘c’ ,这样就可以表示一个字符都不相同的字符串 allowed 了,它具有字符 (char)(0 + ‘a’) 以及 (char)(2 + ‘a’) ,将 allowed 对应的数称为 ans 。
那么将 words 里的字符串都这样处理,都会获得一个对应的数 res。
当求得一个字符串 word 中的所有字符都出现于 allowed 时,就相当于 word 所对应的数 res 二进制位为 1 的那些位,在 ans 上这些位也都为 1 。
故,如果需要判断 res 的每一个为 1 的位,是否在 ans 上也为 1 ,只需要 res & ans ,来判断结果是否为 res 。
如果不为 res,则说明 res 上某一个为 1 的位,与 ans 对应位上的 0 所相与为 0 ,其总和将小于 res 而非等于 res。
class Solution {
public int countConsistentStrings(String allowed, String[] words) {
int ans = solve(allowed);
int total = 0;
for (String word : words) {
int res = solve(word);
if((res & ans) == res){
total ++;
}
}
return total;
}
public int solve(String s) {
int ans = 0;
for(int i = 0; i < s.length(); i++) {
int x = s.charAt(i) - 'a';
ans |= (1 << x);
}
return ans;
}
}
作者:zheng-rong-zhu
链接:https://leetcode-cn.com/problems/count-the-number-of-consistent-strings/solution/zhuang-tai-ya-suo-wei-yun-suan-by-zheng-xl00a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
注:
java中有三种移位运算符:
‘<<’ : 左移运算符,num << 1,相当于num乘以2
‘>>’ : 右移运算符,num >> 1,相当于num除以2
‘>>>’ : 无符号右移,忽略符号位,空位都以0补齐