字符串匹配
精确:
indexOf(String str); -- strstr(), O(mn)。
lastIndexOf(String str); -- continue 的别样用法。
matches(String regex); -- Regex.compile()/match()。
模糊:
java package?
Spell Checker -- 两个字符串的相似程度
Fuzzy Finder -- 子列匹配
上面两个问题都可以用这个概念”编辑距离”来有效解决。
所谓这个距离是指从一个字符串变到另一个字符串所需操作序列的度量;
这些操作包括:替换 shot --> spot, 插入 ago --> agog, 删除 hour --> our。
对于子列匹配,设用户正在输入的s比目标字符串t短,比如Skina是Skienna的子列,
需要两个插入操作,距离为d=2。
问题: |s| + d = |t| 是否表明s是t的子列?
设P(i, j) 表示把s[0..i] 变成t[0..j]的问题,d[i][j]为所需操作的最短距离。
P(i,j)有optimal substructure性质,即子问题P(i-1,j-1), P(i-1,j),
P(i,j-1)构成P(i,j)。证明使用cut-and-paste反证:如果其组成的子问题解
不是最优的,比如d[i-1][j-1], 把它用一个更优的解替换掉,则P(i,j)更小,
与P(i,j)最优矛盾。
带记忆的递归写法的优点是有些子问题不用解。