El tema es de LeetCode
49. Agrupación de palabras de letras extranjeras
Se puede acceder a otras soluciones o código fuente: tongji4m3
descripción
Dada una serie de cadenas, combine la letra dislexia. Las palabras alifáticas se refieren a cadenas con las mismas letras pero con diferentes disposiciones.
Ejemplo:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
Descripción:
Todas las entradas están en minúsculas.
No se considera el orden en el que se emiten las respuestas.
Ideas
Utilice un mapa para almacenar el índice y el grupo correspondiente del índice. El índice es un identificador único calculado a partir del disforismo de letras. De esta manera, recorra la matriz strs y coloque cadenas con el mismo índice en el mismo grupo.
En cuanto al cálculo del índice, cada letra se puede vincular a un número primo. Para una cadena, multiplique los números primos de cada letra contenida, y la suma es el índice
La segunda forma de escritura es similar a la anterior: el mapa almacena cadenas lexicográficas y grupos correspondientes. Convierta la cadena en una cadena lexicográfica cada vez que pase por el bucle y luego juzgue
detalle
El mapa almacena directamente el índice utilizado para la agrupación de zonas y el grupo Lista se puede utilizar para ahorrar memoria.
Código
//生成素数
private List<Integer> prime()
{
int N = 26;
List<Integer> result = new LinkedList<>();
for (int i = 2; i < 1000; i++)
{
int j;
for (j = i - 1; j > 1; j--)
{
if (i % j == 0) break;
}
if(j==1) result.add(i);
if(result.size()==N) break;
}
return result;
}
//素数可以提前生成好
public List<List<String>> groupAnagrams(String[] strs)
{
Map<Integer, List<String>> map = new HashMap<>();
//List<Integer> prime = prime();
//预先准备好
int[] prime = {
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101};
for (String string : strs)
{
int index = 1;
for (char ch : string.toCharArray())
{
// index*=prime.get(ch - 'a');
index*=prime[ch-'a'];
}
if(!map.containsKey(index)) map.put(index, new LinkedList<>());
map.get(index).add(string);
}
return new LinkedList<>(map.values());
}
//第二种思路
//map存储字典序字符串和对应的组。每次循环都把字符串转为字典序字符串,再判断
public List<List<String>> groupAnagrams1(String[] strs)
{
Map<String, List<String>> map = new HashMap<>();
for (int i = 0; i < strs.length; i++)
{
//map中只存储字典序字符串
char[] chars = strs[i].toCharArray();
Arrays.sort(chars);
String string = String.valueOf(chars);
//第一次放入某类型的字母异位词
if (!map.containsKey(string)) map.put(string, new LinkedList<>());
map.get(string).add(strs[i]);
}
return new LinkedList<>(map.values());
}
Análisis de complejidad
complejidad del tiempo
El primer método: O (NK) O (NK)O ( N K ) N es la longitud de la matriz y K es la longitud máxima de la cadena. El bucle exterior necesita atravesar la matriz de cadenas una vez, y el interior necesita calcular el índice de cada cadena.
El segundo método: O (NK log K) O (NK \ log K)O ( N Klo gK ) N es la longitud de la matriz y K es la longitud máxima de la cadena. El bucle exterior necesita atravesar la matriz de cadenas una vez. Cada cadena debe ordenarse internamente
Complejidad espacial
O (NK) O (NK) O ( N K ) Almacenado en los valores del Mapa requiere un total de espacio NK