构建回文串检测
难度:
标签:
题目描述
代码结果
运行时间: 102 ms, 内存: 55.7 MB
/*
* 题目思路:
* 使用Java Stream对题目进行处理。对于每一个查询 [left, right, k],我们统计子串中出现的每个字母的次数。
* 然后计算出现奇数次的字母个数,如果这个数量小于等于 k + 1,则可以通过 k 次替换使得子串变为回文。
*/
import java.util.stream.IntStream;
public class Solution {
public List<Boolean> canMakePaliQueries(String s, int[][] queries) {
int n = s.length();
int[][] prefix = new int[n + 1][26];
for (int i = 0; i < n; i++) {
System.arraycopy(prefix[i], 0, prefix[i + 1], 0, 26);
prefix[i + 1][s.charAt(i) - 'a']++;
}
return Arrays.stream(queries).map(query -> {
int left = query[0], right = query[1], k = query[2];
long oddCount = IntStream.range(0, 26)
.filter(i -> (prefix[right + 1][i] - prefix[left][i]) % 2 != 0)
.count();
return oddCount / 2 <= k;
}).collect(Collectors.toList());
}
}
解释
方法:
题解使用了前缀XOR和位运算来有效地处理查询。首先,它通过记录每个字符的位向量(一个长度为26的位向量,每位表示一个字母是否出现奇数次)的前缀XOR数组cnt来处理字符串s。这样,任何子串s[l...r]的奇偶位图可以通过cnt[r+1] XOR cnt[l]快速获得。每个查询检查通过计算此XOR结果中置位的数量(即奇数字符的个数),然后判断是否可以通过至多k次替换使奇数个数的字符变为偶数个,从而形成回文串。
时间复杂度:
O(n + q)
空间复杂度:
O(n)
代码细节讲解
🦆
在算法中使用前缀XOR数组来处理字符串的奇偶性,这种方法如何保证能准确地反映子串中每个字符的出现次数?
▷🦆
为什么在计算子串s[l...r]的奇数字符个数时,使用cnt[r+1] XOR cnt[l]得到的结果可以直接用来确定字符的奇偶性?
▷🦆
题解中提到,通过位运算来计算字符是否出现奇数次,具体是如何实现的?能否详细解释一下这个位运算的逻辑和过程?
▷