我正在处理一系列具有不同长度的长字符串(例如,'ABAABBFGGBHHSFAFDAFDAFDBB'
)。对于每个字符串,我想找到特定子字符串的最长连续出现的长度(例如 'AFD'
,上面示例中的答案是 3
)。使用 MATLAB 实现此目的的任何优雅方法?
最佳答案
让输入和搜索字符串为 -
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
总结讨论,整个代码可以像这样制作成紧凑版本 -
df1 = diff([0 diff(strfind(in_str,search_str))==numel(search_str) 0])
out = max(find(df1==-1) - find(df1==1))+1
关于string - 较长字符串中最长重复字符串的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30618078/