LeetCode 1177. Construir detección de cadena de palíndromo (prefijo y)

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 = 2solo 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;
    }
};

Inserte la descripción de la imagen aquí

842 artículos originales publicados · Me gusta 2148 · Visitas 440,000+

Supongo que te gusta

Origin blog.csdn.net/qq_21201267/article/details/105498437
Recomendado
Clasificación