假设您将矩阵重整为帖子中的格式,您可以复制 s1 并堆叠字符串,使其具有与重整后的 s2 矩阵中的行数一样多的行,然后执行相等操作员。由全 1 组成的行意味着我们找到了匹配项,因此您只需搜索总和等于 s1 总长度的那些行。参考back to my post on dividing up a string into overlapping substrings,我们可以将您的字符串分解为您在问题中发布的内容,如下所示:
%// Define s1 and s2 here
s1 = 'abc';
len = length(s1);
s2 = 'kokoabckokabckoab';
%// Hankel starts here
c = (1 : len).';
r = (len : length(s2)).';
nr = length(r);
nc = length(c);
x = [ c; r((2:nr)') ]; %-- build vector of user data
cidx = (1:nc)';
ridx = 0:(nr-1);
H = cidx(:,ones(nr,1)) + ridx(ones(nc,1),:); % Hankel subscripts
ind = x(H); % actual data
%// End Hankel script
%// Now get our data
subseqs = s2(ind.');
%// Case where string length is 1
if len == 1
subseqs = subseqs.';
end
subseqs 包含您在帖子中提到的重叠字符矩阵。您已经注意到一个小错误,如果字符串的长度为 1,那么算法将不起作用。您需要确保重构的子字符串矩阵由单个 column 向量组成。如果我们在不检查s1 的长度的情况下运行上述代码,我们会得到一个行向量,如果是这种情况,只需转置结果即可。
现在,只需复制s1 的次数与我们在subseqs 中的行数一样多,这样所有这些字符串都会堆叠成一个二维矩阵。之后,做一个相等运算符。
eqs = subseqs == repmat(s1, size(subseqs,1), 1);
现在,找到按列的总和,看看哪些元素等于字符串的长度。这将产生一个单列向量,其中1 表示我们找到了匹配项,否则为零:
sum(eqs, 2) == len
ans =
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
最后,要将子字符串匹配的多少次相加,您只需将此向量中的所有元素相加即可:
out = sum(sum(eqs, 2) == len)
out =
2
因此,我们有 两个 在您的字符串中找到 abc 的实例。