鉴于两个字符串,我如何找到彼此之间的重复数量?

Osh*_*h24 2 string matlab

例如s1='abc',s2='kokoabckokabckoab'.输出应该是3.(s1出现在s2中的次数).

不允许使用forstrfind.只能用reshape,repmat,size.

我想重塑s2,所以它将包含所有可能的3s字符串:

s2 =

奥科

兴亚

OAB

......等

但我从这里遇到麻烦..

ray*_*ica 5

假设您将矩阵重新整形为帖子中的格式,您可以复制s1并堆叠字符串,使其具有与重新整形s2矩阵中的行数一样多的行,然后执行相等运算符.由全1组成的行意味着我们找到了匹配,因此您只需搜索总和等于总长度的行s1.参照回到我的岗位上划分了一个字符串转换成重叠子,我们可以分解你的字符串转换成你已经张贴在你的问题如下所示:

%// 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
Run Code Online (Sandbox Code Playgroud)

subseqs包含您在帖子中提到的重叠字符矩阵.您已经注意到一个小错误,如果字符串的长度为1,则算法将无效.您需要确保重新整形的子串矩阵由单个向量组成.如果我们运行上面的代码而不检查长度s1,我们会得到一个行向量,所以如果是这种情况,只需转置结果.

现在,只需复制s1我们有行的次数,subseqs以便所有这些字符串都堆叠成2D矩阵.之后,做一个相等运算符.

eqs = subseqs == repmat(s1, size(subseqs,1), 1);
Run Code Online (Sandbox Code Playgroud)

现在,找到按列的总和,看看哪些元素等于字符串的长度.这将生成一个列向量,1表示我们找到了匹配项,否则为零:

sum(eqs, 2) == len

ans =

     0
     0
     0
     0
     1
     0
     0
     0
     0
     0
     1
     0
     0
     0
     0
Run Code Online (Sandbox Code Playgroud)

最后,要添加子串匹配的次数,您只需要将此向量中的所有元素相加:

out = sum(sum(eqs, 2) == len)

out = 

2
Run Code Online (Sandbox Code Playgroud)

因此,我们在您的字符串中找到了两个实例abc.