正则表达式匹配
例如:字符串abaaaa能被表达式 a.a* 匹配
解释:.字符是能充当任意字符的,这里充当字符 b,而*字符可以使前面一个字符重复0-n次
这里算法采用动态规划思想
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
swift:
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]
}