题目链接
运用了前缀和+位运算的思想
思路:
1. 通过数字每位代表每个字母
2. 使用int数组记录以i(0<=i<len)结尾的前缀串每个字母的奇偶性,以count[i+1]表示
3. [l,r]区间的子串每个字母的奇偶性由count[r+1]^count[l]表示,
4. 使用x&=x-1快速找位中1的个数
5. k
项替换成任何小写英文字母,最多能将2k+1长度的的每个字母都为1个的字符串替换为回文串。
class Solution {
public List<Boolean> canMakePaliQueries(String s, int[][] queries) {
int strLen = s.length();
int [] count = new int[strLen+1];
List<Boolean>result = new ArrayList<>();
for(int i=0;i<strLen;i++) {
count[i+1] = count[i]^(1<<(s.charAt(i)-'a'));
}
int queryLen = queries.length;
for(int i=0;i<queryLen;i++) {
int left = queries[i][0], right = queries[i][1], k = queries[i][2];
int x= count[left]^count[right+1];
int bit=0;
while(x>0){
x&=x-1;
bit++;
}
result.add(bit<=(2*k+1));
}
return result;
}
}