Finding the shortest repetitive pattern in a string

后端 未结 4 1607
旧巷少年郎
旧巷少年郎 2021-01-18 05:20

I was wondering if there was a way to do pattern matching in Octave / matlab? I know Maple 10 has commands to do this but not sure what I need to do in Octave / Matlab. So

4条回答
  •  情书的邮戳
    2021-01-18 05:58

    I'm not sure if this can be accomplished with regular expressions. Here is a script that will do what you need in the case of a repeated word called pattern.

    It loops through the characters of a string called str, trying to match against another string called pattern. If matching fails, the pattern string is extended as needed.

    EDIT: I made the code more compact.

    str = 'lullabylullabylullaby';
    
    pattern = str(1);
    matchingState = false;
    sPtr = 1;
    pPtr = 1;
    
    while sPtr <= length(str)
         if str(sPtr) == pattern(pPtr) %// if match succeeds, keep looping through pattern string
                matchingState = true;
                pPtr = pPtr + 1;
                pPtr = mod(pPtr-1,length(pattern)) + 1;
         else                          %// if match fails, extend pattern string and start again
                if matchingState
                    sPtr = sPtr - 1;   %// don't change str index when transitioning out of matching state
                end  
                matchingState = false;
                pattern = str(1:sPtr);
                pPtr = 1;
         end
    
         sPtr = sPtr + 1;
    
    end
    
    display(pattern);
    

    The output is:

    pattern =
    
    lullaby
    

    Note:

    This doesn't allow arbitrary delimiters between occurrences of the pattern string. For example, if str = 'lullaby1lullaby2lullaby1lullaby2';, then

    pattern =
    
    lullaby1lullaby2
    

    This also allows the pattern to end mid-way through a cycle without changing the result. For example, str = 'lullaby1lullaby2lullaby1'; would still result in

    pattern =
    
    lullaby1lullaby2
    

    To fix this you could add the lines

    if pPtr ~= length(pattern)
        pattern = str;
    end
    

提交回复
热议问题