Search code examples
cstring-comparisonlongest-substring

LRS using C program


So I want to create a function using C to find the longest repeated non overlapping substring in a given string. For example: input banana. Output: an.

I was thinking using comparison of the array of the string and checking for repeats. Is that a viable approach? How would I be able to compare substrings with the rest of the strings. I want to avoid using suffix trees if possible

#include <stdio.h>
#include <string.h>

void stringcheck(char a[],int len, int s1, int s2)
{

    int i=s1+1;
    int j=s2+1;
    if(j<=len&&a[i]==a[j])
    {
        printf("%c",a[i]);
        stringcheck(a,len,i,j);
    }

}
void dupcheck(char a[], int len, int start)
{
    for(int i=start;i<len-1;i++)
    {
       for(int j=i+1;j<=len;j++)
       {
           if(a[i]==a[j])
           {
               printf("%c",a[i]);
               stringcheck(a,len,i,j);
               i=len;
           }

       }
    }
}


int main()
{
    char input[99];
    scanf("%s",input);
    int start=0;
    int len =strlen(input);
    dupcheck(input,len,start);
    return 0;

}

Solution

  • Yes, this is a valid approach.
    You can compare the string - character by character, that way no need to truly save a substring.

    You can see a dynamic solution using c++ taking that approach here: https://www.geeksforgeeks.org/longest-repeating-and-non-overlapping-substring/
    This solution can be converted to c without many changes.

    Another variant if the option is to save the substring by its' indexes.
    You can then compare it against the string, and save the max substring, however this will take O(n^3) when the above solution does it in O(n^2).

    edit: I converted the solution to c:

    #include <stdio.h>
    #include <string.h>
    
    void longestRepeatedSubstring(char * str, char * res) 
    { 
        int n = strlen(str);
        int LCSRe[n+1][n+1];
        int res_length  = 0; // To store length of result
        int i, j, index = 0;
    
        // Setting all to 0 
        memset(LCSRe, 0, sizeof(LCSRe)); 
    
        // building table in bottom-up manner 
        for (i=1; i<=n; i++) 
        { 
            for (j=i+1; j<=n; j++) 
            { 
                // (j-i) > LCSRe[i-1][j-1] to remove 
                // overlapping 
                if (str[i-1] == str[j-1] && 
                    LCSRe[i-1][j-1] < (j - i)) 
                { 
                    LCSRe[i][j] = LCSRe[i-1][j-1] + 1; 
    
                    // updating maximum length of the 
                    // substring and updating the finishing 
                    // index of the suffix 
                    if (LCSRe[i][j] > res_length) 
                    { 
                        res_length = LCSRe[i][j]; 
                        index = (i>index) ? i : index; 
                    } 
                } 
                else
                    LCSRe[i][j] = 0; 
            } 
        } 
    
        // If we have non-empty result, then insert all 
        // characters from first character to last 
        // character of string
        j=0;
        if (res_length > 0) {
            for (i = index - res_length + 1; i <= index; i++) {
                res[j] = str[i-1];
                j++;
            }
        }
        res[j]=0;
    } 
    
    // Driver program to test the above function 
    int main() 
    { 
        char str[] = "banana";
        char res[20];
        longestRepeatedSubstring(str, res);
        printf("%s",res); 
        return 0; 
    }