1. Título
Darle una cadena s, compruebe la subcadena de s.
Cada prueba, la subcadena que se probará se puede expresar como queries[i] = [left, right, k]
. Podemos reorganizar la subcadena s[left], ..., s[right]
, y seleccionar las mayoría de los elementos k sustituyen a cualquier letras minúsculas.
Si la subcadena puede convertirse en una cadena de palíndromo en el proceso de detección anterior, el resultado de la detección es verdadero; de lo contrario, el resultado es falso.
Devuelva la respuesta de matriz de respuestas [], donde la respuesta [i] es el resultado de la detección de las consultas de subcadena i-ésima [i] que se probarán.
Nota: Al reemplazar, cada letra en la subcadena debe contarse como un elemento independiente, es decir, si s[left..right] = "aaa" 且 k = 2
solo podemos reemplazar dos letras en ella. (Además, cualquier prueba no modificará la cadena original, se puede considerar que cada prueba es independiente)
示例:
输入:s = "abcda", queries = [[3,3,0],[1,2,0],[0,3,1],[0,3,2],[0,4,1]]
输出:[true,false,false,true,true]
解释:
queries[0] : 子串 = "d",回文。
queries[1] : 子串 = "bc",不是回文。
queries[2] : 子串 = "abcd",只替换 1 个字符是变不成回文串的。
queries[3] : 子串 = "abcd",可以变成回文的 "abba"。
也可以变成 "baab",先重新排序变成 "bacd",然后把 "cd" 替换为 "ab"。
queries[4] : 子串 = "abcda",可以变成回文的 "abcba"。
提示:
1 <= s.length, queries.length <= 10^5
0 <= queries[i][0] <= queries[i][1] < s.length
0 <= queries[i][2] <= s.length
s 中只有小写英文字母
Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/can-make-palindrome-from-substring Los
derechos de autor pertenecen a la red de deducción. Comuníquese con la autorización oficial para la reimpresión comercial e indique la fuente de la reimpresión no comercial.
2. Resolución de problemas
- Cuenta de prefijo registrada en cada posición de personaje
- Obtenga el recuento de caracteres del intervalo [l, r] por r- (l-1)
- Cuenta el número de ocurrencias de caracteres extraños
- La longitud del intervalo es un número par impar-2 * k <= 0
- La longitud del intervalo es impar impar-2 * k <= 1
class Solution {
public:
vector<bool> canMakePaliQueries(string s, vector<vector<int>>& queries) {
int i, j, l, r, n = queries.size(), odd;
vector<vector<int>> count(s.size(),vector<int>(26,0));
vector<int> temp(26,0);
vector<bool> ans(n);
for(i = 0; i < s.size(); ++i)
{
temp[s[i]-'a']++;
count[i] = temp;//前缀字符计数
}
for(i = 0; i < n; ++i)
{
l = queries[i][0];
r = queries[i][1];
temp = count[r];
if(l-1>=0)
{
for(j = 0; j < 26; ++j)
temp[j] -= count[l-1][j];
}
odd = 0;
for(j = 0; j < 26; ++j)
if(temp[j]%2)
odd++;
if((r-l)%2)//长度偶数
ans[i] = (odd-2*queries[i][2]<=0);
else
ans[i] = (odd-1-2*queries[i][2]<=0);
}
return ans;
}
};