APL中如何获取字符串内所有匹配子串的起始位置?
解决APL中获取所有匹配子串起始位置的问题
要获取大字符串中所有与小字符串的长度为3的子串匹配的起始位置,你可以调整思路,直接检查大字符串的每个3长度滑动窗口是否存在于小字符串的3长度滑动窗口集合中,再提取对应位置:
⍸ (3,/'ABCDEFGHIJKLMNOP') ∊ (3,/'DEFGHI')
这段代码的逻辑是:
3,/'ABCDEFGHIJKLMNOP'生成大字符串的所有3长度滑动子串3,/'DEFGHI'生成小字符串的所有3长度滑动子串(共4个:DEFEFGFGHGHI)∊用于检查大字符串的每个子串是否属于小字符串的子串集合,返回布尔向量⍸提取布尔向量中所有为1的位置,即你需要的起始位置4 5 6 7
另外,你原来的代码返回单个位置是因为(3,/'DEFGHI') ⍷ 3,/'ABCDEFGHIJKLMNOP'返回的是4×14的布尔矩阵,⍸会返回矩阵中所有1的线性索引(比如第一个匹配的线性索引是4),而非对应的列号(起始位置)。如果想基于原代码修改,可以用如下方式提取列位置:
⊃∘.,⍸ (3,/'DEFGHI') ⍷ 3,/'ABCDEFGHIJKLMNOP'
这里⊃∘.,⍸会先找出所有匹配的行和列坐标,再提取列坐标部分,最终得到目标结果。
内容的提问来源于stack exchange,提问作者userABC123
相关产品推荐
相关产品推荐

