【发布时间】:2015-06-03 10:55:18
【问题描述】:
我正在处理一系列不同长度的长字符串(例如,'ABAABBFGGBHHSFAFDAFDAFDBB')。对于每个字符串,我想找出特定子字符串最长连续出现的长度(例如'AFD',上例中的答案是3)。用 MATLAB 实现这一点的任何优雅方法?
【问题讨论】:
我正在处理一系列不同长度的长字符串(例如,'ABAABBFGGBHHSFAFDAFDAFDBB')。对于每个字符串,我想找出特定子字符串最长连续出现的长度(例如'AFD',上例中的答案是3)。用 MATLAB 实现这一点的任何优雅方法?
【问题讨论】:
让输入和搜索字符串为 -
in_str = 'ABAAAFDAFDBBFGGBHHSFAFDAFDAFDBB'
search_str = 'AFD'
我们可以使用strfind 来获取输入字符串中搜索字符串的起始索引,并从中检测连续的搜索字符串组 -
idx = strfind(in_str,search_str)
grp_matches = diff(idx)==numel(search_str)
所以,现在我们有了 0 和 1 的“岛”,其中 1 的岛表示存在连续的分组搜索字符串。接下来,我们需要找到岛屿的长度,最大的岛屿长度将是所需的输出 -
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
【讨论】:
'ABAAAFDAFDBBFGGBHHSFAFDAFDAFDBB'
使用正则表达式:
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
【讨论】:
cellfun('length'..),跟随Undocumented blog post?另外,列出了here。
如果您还不知道要查找的字符串内容是什么:
length: N/2),如果相等,则完成。找到最长的字符串。M < N/2 的字符串的窗口版本(子字符串),并对每帧的结果运行AND。如果选定的子窗口在其中,AND 将针对它所在的字符串部分生成1,并且您已完成,您找到了最长的重复出现的子字符串。M = M - 1 并重复 #3 而没有发现和 M > 0。M = 0。【讨论】: