1. Introducción a los problemas de retroceso
El problema del retroceso es el proceso transversal del árbol de decisiones. El problema del retroceso debe considerar las siguientes preguntas
Ruta: la elección que se ha hecho, es decir, la ruta desde el nodo raíz al nodo actual
Lista de selección: qué otras opciones se pueden hacer en la situación actual, es decir, continuar atravesando los nodos y qué caminos se pueden tomar.
Condición final: llegar al nodo hoja del árbol de decisiones o detenerse si no se cumple la condición
2. Marco de problemas de retroceso
Después de comprender varios aspectos del problema del retroceso, veamos el marco básico del retroceso
List<String> result = new ArrayList<String>();
public void backtrack(已经选择的路径,可以做选择的列表) {
if (满足结束条件)
result.add(已经选择的路径);
return;
for 选择 in 可以做选择的列表 {
选择列表.remove(选择);
已经选择的路径.add(选择);
backtrack(已经选择路径,可以做选择的路径);
//撤销
已经选择的路径.remove(选择);
可以做选择的列表.add(选择);
}
}
3. Caso
La óptica no practica los mangos falsos. Antes de ver la idea, escríbala usted mismo y vea si hay espacio para la optimización.
3.1 Arreglo completo de cadenas
Dada una secuencia de números sin repetición , devuelve toda la matriz completa posible. Fuente: https://leetcode-cn.com/problems/permutations/
Ejemplo:
//输入: [1,2,3]
//输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
int[] visited = new int[nums.length];
backtrack(res, nums, new ArrayList<Integer>(), visited);
return res;
}
private void backtrack(List<List<Integer>> res, int[] nums, ArrayList<Integer> tmp, int[] visited) {
if (tmp.size() == nums.length) {
res.add(new ArrayList<>(tmp));
return;
}
for (int i = 0; i < nums.length; i++) {
if (visited[i] == 1) continue;
visited[i] = 1;
tmp.add(nums[i]);
backtrack(res, nums, tmp, visited);
visited[i] = 0;
tmp.remove(tmp.size() - 1);
}
}
}
Nota : donde res
está el retorno general, tmp es un nodo en la ruta actual, visited
y nums
para identificar cuáles son los nodos actuales a los que puede acceder
3.2 Dirección IP legal
Dada una cadena que contenga solo números, restáurela y devuelva todos los formatos de dirección IP posibles. Fuente: https://leetcode-cn.com/problems/restore-ip-addresses/
Una dirección IP válida consta de exactamente cuatro números enteros (cada número entero está entre 0 y 255 y no puede contener un 0 a la izquierda) y los números enteros están separados por ".".
Por ejemplo: "0.1.2.201" y "192.168.1.1" son direcciones IP válidas, pero "0.011.255.245", "192.168.1.312" y "[email protected]" son direcciones IP no válidas.
Ejemplo 1:
Entrada: s = "25525511135" Salida: ["255.255.11.135", "255.255.111.35"] Ejemplo 2:
Entrada: s = "0000" Salida: ["0.0.0.0"] Ejemplo 3:
Entrada: s = "1111" Salida: ["1.1.1.1"] Ejemplo 4:
Entrada: s = "010010" Salida: ["0.10.0.10", "0.100.1.0"] Ejemplo 5:
输入 : s = "101023" 输出 : ["1.0.10.23", "1.0.102.3", "10.1.0.23", "10.10.2.3", "101.0.2.3"]
Resuelve el código
class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> res = new ArrayList();
List<String> temp = new ArrayList();
helper(res,temp,s);
return res;
}
void helper(List<String> res,List<String> temp,String next) {
if(temp.size() > 4) {
return;
}
if(temp.size() == 4 && next.length() == 0) {
String ip = temp.get(0) + "." + temp.get(1) + "." + temp.get(2) + "." + temp.get(3);
res.add(ip);
return;
}
for(int i = 0; i < next.length(); i++) {
String s = next.substring(0,i+1);
if(s.length() > 1 && s.charAt(0) == '0') {
continue;
}
if(s.length() > 3) {
continue;
}
if(s.length() == 3 && "255".compareTo(s) < 0) {
continue;
}
temp.add(s);
helper(res,temp,next.substring(i+1));
temp.remove(temp.size() - 1);
}
}
}
Nota : El marco general todavía adopta la estructura anterior, pero al juzgar si el nodo actual debe agregarse a la temperatura, se debe hacer un juicio un poco más complicado. Wu Xie, Xiao San Ye, un pequeño novato en segundo plano, big data, e inteligencia artificial. Presta atención a más