较长字符串中最长重复字符串的长度

时间:2015-06-03 10:55:18

标签: string matlab substring

我正在处理一系列具有不同长度的长字符串(例如'ABAABBFGGBHHSFAFDAFDAFDBB')。对于每个字符串,我想查找特定子字符串的最长连续出现的长度(例如'AFD',上面示例中的答案为3)。用MATLAB实现这一目标的优雅方法是什么?

3 个答案:

答案 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)

如果您还不知道正在寻找的字符串内容是什么:

  1. 将字符串的前半部分与后半部分(length: N/2)进行比较,如果相等,则完成。找到最长的字符串。
  2. 否则:进行子样本的按位自相关。步骤:
  3. 通过进行按位自相关来比较长度为M < N/2的总字符串的窗口版本(子字符串),并对每个帧的结果运行AND。如果选定的子窗口在那里,AND将为其所在的字符串部分生成1并且您已完成,您找到了最长的重复子字符串。
  4. 如果#3 没有返回肯定结果(没有出现),减少长度 M of substring by 1:M = M - 1并重复#3 ,但未找到任何匹配项M > 0
  5. 如果绝对没有再出现任何子字符串,您只需知道一次M = 0