LCS

求两个字符串的最长公共子序列。

语法

LCS key1 key2 [LEN] [IDX] [MINMATCHLEN min-match-len] [WITHMATCHLEN]

引入版本:7.0.0

复杂度摘要:O(N*M)

LCS命令实现最长公共子序列算法。请注意,这与最长公共字符串算法不同,因为字符串中的匹配字符不需要是连续的。

例如“foo”和“fao”之间的LCS是“fo”,因为从左到右扫描两个字符串,最长的公共字符集是由第一个“f”然后是“o”组成的。

LCS 对于评估两个字符串的相似程度非常有用。字符串可以代表很多东西。例如,如果两个字符串是 DNA 序列,LCS 将提供两个 DNA 序列之间相似性的度量。 If the strings represent some text edited by some user, the LCS could represent how different the new text is compared to the old one, and so forth.

请注意,该算法运行 O(N*M) 时间,其中 N 是第一个字符串的长度,M 是第二个字符串的长度。因此,要么使用单独的 Redis 实例来运行此算法,要么确保针对非常小的字符串运行它。

必需参数

key1

第一个键的名称。

key2

第二个键的名称。

可选参数

LEN

返回最长公共子序列的长度而不是子序列本身。

IDX

返回匹配的位置而不是匹配的字符串。

MINMATCHLEN min-match-len

与 IDX 一起使用时,仅返回至少 min-match-len 个字符长的匹配项。

WITHMATCHLEN

与 IDX 一起使用时,在结果中包含每个匹配的长度。

示例

> MSET key1 ohmytext key2 mynewtext
OK
> LCS key1 key2
"mytext"

有时您只需要比赛的长度:

> LCS key1 key2 LEN
(integer) 6

然而,通常非常有用的是了解每个字符串中的匹配位置:

> LCS key1 key2 IDX
1) "matches"
2) 1) 1) 1) (integer) 4
         2) (integer) 7
      2) 1) (integer) 5
         2) (integer) 8
   2) 1) 1) (integer) 2
         2) (integer) 3
      2) 1) (integer) 0
         2) (integer) 1
3) "len"
4) (integer) 6

匹配是从最后一个到第一个产生的,因为这就是算法的工作原理,并且以相同的顺序发出匹配会更有效。上面的数组意味着第一个匹配项(数组的第二个元素)位于第一个字符串的位置 2-3 和第二个字符串的位置 0-1 之间。接下来还有一场4-7和5-8的比赛。

将匹配列表限制为给定最小长度的匹配列表:

> LCS key1 key2 IDX MINMATCHLEN 4
1) "matches"
2) 1) 1) 1) (integer) 4
         2) (integer) 7
      2) 1) (integer) 5
         2) (integer) 8
3) "len"
4) (integer) 6

最后,您可能还想获取匹配长度:

> LCS key1 key2 IDX MINMATCHLEN 4 WITHMATCHLEN
1) "matches"
2) 1) 1) 1) (integer) 4
         2) (integer) 7
      2) 1) (integer) 5
         2) (integer) 8
      3) (integer) 4
3) "len"
4) (integer) 6

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 标准
✅ 主动-主动
✅ 标准
✅ 主动-主动

返回值

RESP2

以下之一: * 批量字符串回复:最长公共子序列。 * 整数回复:给定LEN时最长公共子序列的长度。 * 数组回复:一个数组,其中包含给定 IDX 时两个字符串中的 LCS 长度和所有范围。

RESP3

以下之一: * 批量字符串回复:最长公共子序列。 * 整数回复:给定LEN时最长公共子序列的长度。 * 地图回复:当给出 IDX 时,包含 LCS 长度和两个字符串中所有范围的映射。

资料来源:Redis 官方 LCS 文档;中文内容参考 Redis 文档许可。