Algoritmo: coincidencia de expresiones regulares (programación dinámica)

Coincidencia de expresiones regulares

Por ejemplo: la cadena abaaaa puede coincidir con la expresión aa*.
Explicación: El carácter . puede actuar como cualquier carácter, aquí actúa como el carácter b , y el carácter * puede repetir el carácter anterior 0-n veces.
El algoritmo aquí utiliza ideas de programación dinámica

referencia de datos de matriz dp

//"abaaaa","a.a*"

//  i\j [ ]  a   .   a   *
//  [ ]  1   0   0   0   0
//   a   0   1   0   0   0
//   b   0   0   1   0   1
//   a   0   0   0   1   1
//   a   0   0   0   0   1
//   a   0   0   0   0   1
//   a   0   0   0   0   1

rápido:

func match ( _ s: String,  _ p: String) -> Bool {
    
    
    let s_Array = Array(s)
    let p_Array = Array(p)
    let s_size = s.count
    let p_size = p.count
    var dp = [[Bool]].init(repeating: [Bool].init(repeating: false, count: p_size + 1), count: s_size + 1)
    for i in 0...s_size {
    
    
        for j in 0...p_size {
    
    
            if j == 0 {
    
    
                dp[i][j] = (i == 0 ? true : false)
            }else{
    
    
                //非空正则表达式 j >= 1
                if p_Array[j - 1] != "*" {
    
    
                    if i > 0 && (s_Array[i - 1] == p_Array[j - 1] || p_Array[j - 1] == "."){
    
    
                        dp[i][j] = dp[i - 1][j - 1]
                    }
                    //否则默认false
                }else{
    
    
                    //正则表达式中 * 此时 j >= 2,因为不存在 *之前必须有字符
                    //假设 *前的字符被忽略
                    dp[i][j] = dp[i][j - 2]
                    if !dp[i][j] {
    
    
                        //说明*前的字符被忽略,无法匹配,不忽略再次匹配试一下
                        if i > 0 && (s_Array[i - 1] == p_Array[j - 2] || p_Array[j - 2] == "."){
    
    
                            dp[i][j] = dp[i - 1][j]     //不忽略的意思就是 j 不变 accc  ac*(这种情况使用)
                        }
                    }
                }
            }
        }
    }
    return dp[s_size][p_size]
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44758107/article/details/127805020
Recomendado
Clasificación