Leetcode 0248: Número estrobogramático III

Descripción del Título:

Un número estrobogramático es un número que se ve igual cuando se gira 180 grados (visto al revés).
Escriba una función para contar el total de números estrobogramáticos que existen en el rango de bajo <= num <= alto.

Ejemplo 1:

Entrada: bajo = “50”, alto = “100”
Salida: 3
Explicación: 69, 88 y 96 son tres números estrobogramáticos.

Nota:

Debido a que el rango puede ser un número grande, los números bajo y alto se representan como una cadena.

Complejidad de tiempo: O (n)
sigue la idea de Leetcode 0247. Dada la longitud de la cadena n, podemos encontrar todos los números de simetría de longitud n mediante recursividad. En esta pregunta, enumeramos desde la longitud de bajo hasta la longitud de alto. En cada enumeración, busque recursivamente el número simétrico debajo de la longitud y satisfaga el valor mayor que bajo y menor que el valor alto. Por lo tanto, esta pregunta solo requiere que se devuelva el número, por lo que el resultado recursivo solo debe establecerse en int.

class Solution {
    
    
    private static final char[][] PAIRS = new char[][] {
    
    
        {
    
    '0', '0'}, {
    
    '1', '1'}, {
    
    '6', '9'}, {
    
    '8', '8'}, {
    
    '9', '6'}};
    public int strobogrammaticInRange(String low, String high) {
    
    
        if(low == null || high == null || low.length() > high.length() 
           || (low.length() == high.length() && low.compareTo(high) > 0))
            return 0;
        int count = 0;
        for (int len = low.length(); len <= high.length(); len++) {
    
    
            count += dfs(low, high, new char[len], 0, len - 1);
        }
        return count;
    }
    
    private int dfs(String low, String high, char[] ch, int left, int right) {
    
    
        if (left > right) {
    
    
            String s = new String(ch);
            if ((ch.length == low.length() && s.compareTo(low) < 0)
                || (ch.length == high.length() && s.compareTo(high) > 0)) {
    
    
                return 0;
            } else {
    
    
                return 1;
            }
        }
        int count = 0;
        for(char[] p : PAIRS){
    
    
            ch[left] = p[0];
            ch[right] = p[1];
            if (ch.length != 1 && ch[0] == '0') {
    
    
                continue; 
            }
            if (left == right && (p[0] == '6' || p[0] == '9')) {
    
    
                continue; 
            }
            count += dfs(low, high, ch, left + 1, right - 1);
        }
        return count;
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43946031/article/details/113918097
Recomendado
Clasificación