leet_44

package
v0.0.0-...-9cc4e77 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 14, 2019 License: MIT Imports: 0 Imported by: 0

README

题意:

* 可以匹配任意长字符串(包括空串) ? 可以匹配任何一个字符

写一个函数判断pattern和待匹配字符串是否匹配

题解:

这题和正则通配很像,就是一个小改动。但是直接裸做超时了……

实际上优化也非常容易想到,就是一个简单的动态规划:

mem[i][j]表示 p[0..i]和s[0..j]是否匹配,则有mem[i][j]= :

  • mem[i-1][j-1] (p[i] == s[j] || p[i] == '?') 如果两个串最后一个字符能匹配
  • mem[i][j-1] || mem[i-1][j] (p[i] == '') 如果p串最后一个字符为

还有些小优化可以减少搜索量:

  • 连续的*可以合并成一个*,如p="ab*****c" 和p="ab*c"是等价的
  • 如果p串形如: "asadasdasqowie??asdase*asddd",在p中第一个*号之前的串可以先和S串进行逐字匹配

我采用了记忆化搜索,但是犯了一个非常愚蠢的错误,连续超时了好几次才发现问题…… 我定义存储搜索结果的二维表定义成了 var mem [][]bool,因此代码中当且仅当mem[i][j] == true才直接返回,因为false是mem的默认值,没法判断到底是mem[i][j]没搜索过还是搜索结果为false。 事实上false和unset不是相同的状态……所以最后把mem的定义换成了:

var mem [][]byte

const (
    _ byte = iota
    yes
    no
)

//...
if mem[i][j] == yes {
    return true
} else if mem[i][j] == no {
    return false
}

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL