La subcadena de palíndromo más larga en el día 3 del plan de 100 días

objetivo de aprendizaje:

¡Continuaré actualizando mis ideas únicas de algoritmos, con la esperanza de traerles una expansión de pensamiento diferente!
Si lo encuentra útil, por favor, siga y apoye!
Su aliento es lo que me mantiene en marcha!
! ! !

Banco de preguntas de Likou Pregunta 5 Enlace oficial


Contenido de aprendizaje:

subcadena palindrómica más larga

给你一个字符串 s,找到 s 中最长的回文子串。

Ejemplo 1:

Entrada: s = "babad"
Salida: "bab"
Explicación: "aba" también es una respuesta que cumple con el significado de la pregunta.
Ejemplo 2:

Entrada: s = "cbbd"
Salida: "bb"
Ejemplo 3:

Entrada: s = "a"
Salida: "a"
Ejemplo 4:

Entrada: s = "ac"
Salida: "a"

提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

Fuente: Código Leet

tiempo de estudio:

2022.1.9


Salida de aprendizaje:

idea uno
inserte la descripción de la imagen aquí

¿Por qué tarda tanto en ejecutarse?
Debido a que hemos llamado a demasiados métodos, la complejidad temporal es muy alta. La función principal es O(n2), y el juicio de si es un palíndromo es O(n) en la función.

Ideas para resolver problemas

1. Esto es similar al método de dirección base en el Día 2. Define una dirección base y luego busca hacia atrás desde esta dirección base para encontrar la cadena de palíndromo más larga
2. Entonces, ¿cómo encontrarlo? Primero determine la dirección base, luego inicie un ciclo for, busque de atrás hacia adelante y encuentre un carácter con la misma dirección base, luego la dirección base es el inicio, la dirección del carácter encontrado es el final y la longitud es end-start+1 La cadena parece ser un palíndromo
3. ¿Cómo determinamos si es un palíndromo? Escribe una función para determinar si es un palíndromo o no. La idea es comparar start+i con end-i, i es de 0 a length/2, si hay una discrepancia, no lo es, devuelve falso directamente
4. Entonces, podemos obtener el más largo a partir de una dirección base Palindrome . Luego mueva la dirección base hacia atrás y continúe el proceso
5. La complejidad temporal de este método será relativamente alta, y se considera que es una idea elegante para resolver problemas en la violencia. Lo optimizaré más adelante
. 6. Pero en comparación con resolución de problemas puramente violenta. Es decir, en términos de juzgar si cada subcadena es un palíndromo, mi método es mucho más elegante. Si se utiliza la violencia pura, en

public class Solution {
    
    
    public string LongestPalindrome(string s) {
    
    
        
        if(s.Length==1)return s;

        int start=0;
        int maxlength=0;
        string maxstring="";
        bool isFind;   //在一次遍历中是否找到
        for(int i=0;i<s.Length;i++){
    
    
            start=i;
            isFind=false;
            for(int j=s.Length-1;j>i;j--){
    
    
                if(s[i]==s[j]){
    
    
                    isFind=true;
                    if(IsPalindrome(s,i,j)){
    
     //子串是不是是回文串
                         if(j-i+1>maxlength){
    
    
                             maxlength=j-i+1;
                             maxstring=s.Substring(i,maxlength);
                         }
                    }
                }
            }
            
            if(!isFind){
    
      //如果这个基地址 后面都没有与它相同的 那它就是一个长度为1的回文串
                if(1>maxlength){
    
    
                    maxlength=1;
                    maxstring=s.Substring(i,1);
                }
            }
        }

        return maxstring;
    }

    
    bool IsPalindrome(string s,int start,int end){
    
    
         int length=end-start+1;

        for(int i=0;i<length/2;i++){
    
    
            if(s[start+i]!=s[end-i]){
    
     //不对称
                return false;
            }
        }
        return true;
    }
}

idea dos
inserte la descripción de la imagen aquí

Ideas para resolver problemas
1. Después de la optimización, el tiempo de ejecución se reduce de 900 a aproximadamente 150, porque se descartan muchos recorridos innecesarios
2. De hecho, se optimizó el paso 2 en la idea 1. Después de seleccionar la dirección base, Entonces al buscar el mismo carácter de atrás hacia adelante, si la longitud del carácter a la dirección base es más corta que la longitud máxima que hemos encontrado ahora, no hay necesidad de juzgar, porque estamos buscando la longitud máxima.

public class Solution {
    
    
    public string LongestPalindrome(string s) {
    
    
        
        if(s.Length==1)return s;

        int start=0;
        int maxlength=0;
        string maxstring="";
        bool isFind;   //在一次遍历中是否找到
        for(int i=0;i<s.Length;i++){
    
    
            start=i;
            isFind=false;
            for(int j=s.Length-1;j>i;j--){
    
    
                if(s[i]==s[j]){
    
    
                    isFind=true;
                    if(j-i+1>maxlength){
    
    
                        if(IsPalindrome(s,i,j)){
    
     //子串是不是是回文串
                            maxlength=j-i+1;
                            maxstring=s.Substring(i,maxlength);
                         }
                    }else{
    
    
                        break;
                    }
                }
            }

            if(!isFind){
    
      //如果这个基地址 后面都没有与它相同的 那它就是一个长度为1的回文串
                if(1>maxlength){
    
    
                    maxlength=1;
                    maxstring=s.Substring(i,1);
                }
            }
        }

        return maxstring;
    }

    bool IsPalindrome(string s,int start,int end){
    
    
         int length=end-start+1;

        for(int i=0;i<length/2;i++){
    
    
            if(s[start+i]!=s[end-i]){
    
     //不对称
                return false;
            }
        }
        return true;
    }
}

Autor: conejillo de indias Xiaohuihui
Los derechos de autor pertenecen al autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización, y para reimpresiones no comerciales, indique la fuente.

Supongo que te gusta

Origin blog.csdn.net/m0_48781656/article/details/122394687
Recomendado
Clasificación