Excel 最长公共子串 (LCS) 公式

问题描述 投票:0回答:1

我见过许多在其他程序或语言中查找最长公共子字符串 (LCS) 或两个字符串之间最长共享文本的解决方案,但没有见过在 Excel 中使用公式的解决方案。在这里发布我自己的解决方案。请随意添加关于如何改进这个公式的建议——

Sarr
看起来特别“臃肿”。

excel formula lcs longest-substring
1个回答
0
投票

TL;博士

  • A1:目标字符串
  • A2:比较器字符串
  • A3:要忽略的相互文本

=LET(s1_adj,SUBSTITUTE(LOWER(A1),LOWER(A3),""),s2_adj,SUBSTITUTE(LOWER(A2),LOWER(A3),""),Sarr,MID(s1_adj,SEQUENCE(LEN(s1_adj)-1),SEQUENCE(,LEN(s1_adj)-1,LEN(s1_adj),-1)),CSarr,UNIQUE(TOCOL(MAP(Sarr,LAMBDA(a,IF(ISNUMBER(FIND(a,s2_adj)),a,""))))),SSarr,FIND(CSarr,TRANSPOSE(CSarr)),SSarrPROD,BYROW(IF(CSarr=TRANSPOSE(CSarr),1,IF(ISNUMBER(SSarr),0,1)),LAMBDA(row,PRODUCT(row))),TEXTJOIN(", ",TRUE,FILTER(CSarr,SSarrPROD<>0)))

此公式不仅会返回 LCS,还会返回所有常见子字符串(前提是子字符串的长度为 2 个或更多字母)。它还支持从考虑中删除两个子字符串中的特定共同文本,以便更轻松地分析较长的字符串。

这是如何运作的:

  1. 小写两个字符串(
    SUBSTITUTE
    区分大小写),然后删除/忽略任何指定的共同文本
  2. 创建目标字符串中所有子字符串(字母序列)的数组
  3. 尝试
    FIND
    比较器字符串中的每个子字符串,并仅返回匹配的
    UNIQUE
    子字符串(可以有重复的字母字符串)。例如,如果目标字符串是“banana”,则“an”的子字符串将在数组中至少出现两次。
  4. 进一步
    FIND
    并删除子子串(因为它们已经被本地 LCS 覆盖)。例如,目标文本“banana”的“an”包含在“anan”中。
  5. TEXTJOIN
    将剩余的公共子字符串放入单个文本单元格中。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.