【问题标题】:Length of longest repeating string within a longer string较长字符串中最长重复字符串的长度
【发布时间】:2015-06-03 10:55:18
【问题描述】:

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

【问题讨论】:

    标签: string matlab substring


    【解决方案1】:

    让输入和搜索字符串为 -

    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'
    • 哈哈!我也尝试过与之前的编辑非常相似的类似方法,但无法概括它。你做得很好:) +1
    【解决方案2】:

    使用正则表达式:

    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
    

    【讨论】:

    【解决方案3】:

    如果您还不知道要查找的字符串内容是什么:

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

    【讨论】:

      猜你喜欢
      • 2017-08-19
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2015-10-21
      • 2012-05-22
      • 1970-01-01
      • 2012-10-23
      相关资源
      最近更新 更多