Dadas duas strings, como você pode verificar se elas são permutadas uma da outra usando o espaço O (1)? Modificar as strings não é permitido de forma alguma.
Nota: O (1) espaço em relação ao comprimento da string E ao tamanho do alfabeto.
algorithms
strings
space-complexity
Anônimo
fonte
fonte
O(log n)
para cadeias de comprimento n que não são constantes por meio do comprimento nem do tamanho do alfabeto. Quando as strings podem ser modificadas temporariamente, acho que há uma solução com alfabeto aumentado, que é linear no tamanho do alfabeto, mas constante no comprimento da string em um modelo logarítmico.Respostas:
A abordagem ingênua seria construir histogramas de ambas as cadeias e verificar se são iguais. Como não temos permissão para armazenar uma estrutura de dados (cujo tamanho seria linear ao tamanho do alfabeto) que poderia ser computado em uma passagem, precisamos contar as ocorrências de cada símbolo possível após a outra:
Obviamente, isso pressupõe que as contagens e os índices do iterador são números inteiros de tamanho constante, em vez de depender do comprimento das strings.
fonte
O(n * min(n, |Σ|))
. Hm, agora que penso nisso, isso soa como a solução "permitida a repetição" da sua resposta, não é?count
não éO(1)
(ou seja, este pode transbordar)count
era umint
:-) Sim, não seria trabalho, mas em Java que não pode acontecer de qualquer maneiraDenote as matrizes por e suponha que elas tenham comprimento n .A,B n
Suponha primeiro que os valores em cada matriz sejam distintos. Aqui está um algoritmo que usa espaço :O(1)
Calcule os valores mínimos de ambas as matrizes e verifique se são idênticas.
Calcule os segundos valores mínimos de ambas as matrizes e verifique se são idênticos.
E assim por diante.
A computação do valor mínimo de uma matriz usa claramente o espaço . Dado o k é o menor elemento, podemos encontrar o ( k +O(1) k menor elemento encontrando o valor mínimo maior que o k é o menor elemento (aqui usamos o fato de que todos os elementos são distintos).(k+1) k
Quando é permitido repetir elementos, modificamos o algoritmo da seguinte maneira:
Calcula-se o mínimo de valores de ambas as matrizes, a contagem de quantas vezes cada aparecem, e verificar o m A , 1 = mmA,1,mB,1 e que as contagens são idênticos.mA,1=mB,1
Calcule os valores mínimos maiores que m A , 1 , m B , 1 nas duas matrizes (respectivamente) e conte quantas vezes cada um aparece. Verifique se m A , 2 = mmA,2,mB,2 mA,1,mB,1 e se as contagens são idênticas.mA,2=mB,2
E assim por diante.
fonte
Defina alguma função f (c) que mapeia algum caractere c para um número primo exclusivo (a = 2, b = 3, c = 5, etc.).
Apenas declarar que você pode usar uma função de mapeamento de números primos é um pouco ondulado e provavelmente onde um problema surgiria mantendo espaço O (1) .O(1)
fonte
Você pode fazer isso éO(nlogn)
. Classifique as duas cadeias e compare-as índice por índice. Se eles diferem em qualquer lugar, não são permutações um do outro.Para uma
O(n)
solução, o hash pode ser usado. Essa função de hash funcionaria e,e
para qualquer letra, seria seu valor ascii. Se os dois hashes das strings diferirem, eles não são permutações um do outro.A função de hash no link:
O uso de hash duplo (ou para exagero ainda mais) alterando o valor de R os identificaria com sucesso como permutações com probabilidade muito alta .
fonte
Digamos que você tenha duas strings chamadas s e t.
Você pode usar heurísticas para garantir que elas não sejam desiguais.
Depois disso, você pode executar facilmente um algoritmo para provar que a string é igual.
É claro que você não pode classificar tão rápido se não tiver permissão para usar espaço adicional. Portanto, não importa qual algoritmo você escolher - cada algoritmo precisará será executado em O (n ^ 2) quando houver apenas O (1) espaço e se a heurística não puder provar que eles não podem ser iguais.
fonte
No código de estilo C para toda a rotina:
Ou no pseudo-código muito detalhado (usando a indexação baseada em 1)
onde a função checkLetters (A, B, i) verifica se existem M cópias de A [i] em A [1] .. A [i], existem pelo menos M cópias de A [i] em B:
e a função findNextValue procura em B um valor iniciando em um índice e retorna o índice onde foi encontrado (ou n + 1, se não encontrado).
fonte
Eu acho que esse é o algoritmo mais simples (comO ( n3 ) Tempo, n comprimento das cordas)
Percorra
string1
estring2
, para cada personagem, verifique com que frequência ele pode ser encontrado emstring1
estring2
. Se um personagem está mais freqüentemente em uma sequência do que na outra, não é uma permutação. Se as frequências de todos os caracteres forem iguais, as cordas são permutações uma da outra.Aqui está um pedaço de python para tornar isso preciso
O programa precisa de alguns ponteiros para cordas (O ( logn ) para contar (
string
,string1
,string2
,char
,char1
,char2
) e variáveis de tamanhocount1
,count2
). Ele precisa verificar se os caracteres são iguais ou não, mas a Dows não precisa de nenhuma ordem nesses caracteres. Talvez seja necessário algumas variáveis para números inteiros pequenos (por exemplo, para manter valores booleanos ou para representar a posição destring
in[string1, string2]
.Claro que você nem precisa das variáveis de contagem, mas pode usar ponteiros.
Este segundo programa precisa de variáveis semelhantes às do primeiro, exceto que não precisa doO ( log( N ) ) variáveis de tamanho para manter os valores de contagem.
Portanto, na verdade, não depende den ou o tamanho do alfabeto.
fonte