我正在处理一系列具有不同长度的长字符串(例如'ABAABBFGGBHHSFAFDAFDAFDBB'
)。对于每个字符串,我想查找特定子字符串的最长连续出现的长度(例如'AFD'
,上面示例中的答案为3
)。用MATLAB实现这一目标的优雅方法是什么?
答案 0 :(得分:4)
使用正则表达式:
str = 'AFDABAABBFGGBHHSFAFDAFDAFDBB'; %// note: two occurrences of repeated 'AFD'
substr = 'AFD'; %// sought substring
r = regexp(str, ['(' substr ')+'], 'match');
lengths = cellfun(@numel, r)/numel(substr);
result = max(lengths);
您可以使用'length'
代替@numel
,而不是suggested by Divakar来提高速度:
lengths = cellfun('length', r)/numel(substr);
在此示例中,
lengths =
1 3
result =
3
答案 1 :(得分:4)
让输入和搜索字符串为 -
in_str = 'ABAAAFDAFDBBFGGBHHSFAFDAFDAFDBB'
search_str = 'AFD'
我们可以使用strfind
来获取输入字符串中搜索字符串的起始索引,并从那些检测连续搜索字符串组中获取索引 -
idx = strfind(in_str,search_str)
grp_matches = diff(idx)==numel(search_str)
所以,现在我们有了“零”和“孤岛”,其中岛屿代表连续分组搜索蜇的存在。接下来,我们需要找到岛长度,最大岛长将是所需的输出 -
df1 = diff([0 grp_matches 0]) %// Perform differentiation of matches
岛屿的结尾在分化结果中用“-1”表示,“1”表示这些岛的开始。所以,(find(df1==-1) - find(df1==1))+1
将是岛长。最终输出将是max
-
out = max(find(df1==-1) - find(df1==1))+1
总结讨论,可以将整个代码制作成 compact 版本 -
df1 = diff([0 diff(strfind(in_str,search_str))==numel(search_str) 0])
out = max(find(df1==-1) - find(df1==1))+1
答案 2 :(得分:0)
如果您还不知道正在寻找的字符串内容是什么:
length: N/2
)进行比较,如果相等,则完成。找到最长的字符串。M < N/2
的总字符串的窗口版本(子字符串),并对每个帧的结果运行AND
。如果选定的子窗口在那里,AND
将为其所在的字符串部分生成1
并且您已完成,您找到了最长的重复子字符串。M = M - 1
并重复#3 ,但未找到任何匹配项M > 0
。M = 0
。