Longest prefix which is also suffix

4

Given a string s, find length of the longest prefix which is also suffix. The prefix and suffix should not overlap.

Examples:

Input : aabcdaabc
Output : 4
The string "aabc" is the longest
prefix which is also suffix.

Input : abcab
Output : 2

Input : aaaa
Output : 2

Simple Solution : Since overlapping of prefix and suffix is not allowed, we break the string from middle and start matching left and right string. If they are equal return size of any one string else try for shorter lengths on both sides.

Below is a solution of above approach!

C++

// CPP program to find length of the longest
// prefix which is also suffix
#include <bits/stdc++.h>
using namespace std;

int longestPrefixSuffix(string s) {
  int n = s.size();

  for (int res = n / 2; res >= 0; res--) {

    // Check for shorter lengths of first half.
    string prefix = s.substr(0, res);
    string suffix = s.substr(n - res, n);

    if (prefix == suffix)
      return res;
  }

  // if no prefix and suffix match occurs
  return 0;
}

int main() {
  string s = "aabcdaabc";
  cout << longestPrefixSuffix(s);
  return 0;
}

Java

// Java program to find length of the longest
// prefix which is also suffix

class GFG {
    
    static int longestPrefixSuffix(String s) 
    {
    int n = s.length();
    
    for (int res = n / 2; res >= 0; res--) {
    
        // Check for shorter lengths of first half.
        String prefix = s.substring(0, res);
        String suffix = s.substring(n - res, n);
    
        if (prefix.equals(suffix))
        return res;
    }
    
    // If no prefix and suffix match occurs
    return 0;
    }
    
    // Driver code
    public static void main (String[] args) 
    {
        String s = "aabcdaabc";
        System.out.println(longestPrefixSuffix(s));
    }
}

// This code is contributed by Anant Agarwal.

Output:

4

Efficient Solution : The idea is to use preprocessing algorithm of KMP search. In the preprocessing algorithm, we build lps array which stores following values.

lps[i] = the longest proper prefix of pat[0..i]
which is also a suffix of pat[0..i].

C++

// Efficient CPP program to find length of 
// the longest prefix which is also suffix
#include<bits/stdc++.h>
using namespace std;

// Returns length of the longest prefix
// which is also suffix and the two do
// not overlap. This function mainly is
// copy computeLPSArray() of in below post
// https://www.geeksforgeeks.org/searching-for-patterns-set-2-kmp-algorithm/
int longestPrefixSuffix(string s)
{
    int n = s.length();

    int lps[n];
    lps[0] = 0; // lps[0] is always 0

    // length of the previous
    // longest prefix suffix
    int len = 0;

    // the loop calculates lps[i]
    // for i = 1 to n-1
    int i = 1;
    while (i < n)
    {
        if (s[i] == s[len])
        {
            len++;
            lps[i] = len;
            i++;
        }
        else // (pat[i] != pat[len])
        {
            // This is tricky. Consider
            // the example. AAACAAAA
            // and i = 7. The idea is
            // similar to search step.
            if (len != 0)
            {
                len = lps[len-1];

                // Also, note that we do
                // not increment i here
            }
            else // if (len == 0)
            {
                lps[i] = 0;
                i++;
            }
        }
    }

    int res = lps[n-1];

    // Since we are looking for
    // non overlapping parts.
    return (res > n/2)? n/2 : res;
}

// Driver program to test above function
int main()
{
    string s = "abcab";
    cout << longestPrefixSuffix(s);
    return 0;
}

Java

// Efficient Java program to find length of 
// the longest prefix which is also suffix

class GFG 
{
    // Returns length of the longest prefix
    // which is also suffix and the two do
    // not overlap. This function mainly is
    // copy computeLPSArray() of in below post
    // https://www.geeksforgeeks.org/searching-
    // for-patterns-set-2-kmp-algorithm/
    static int longestPrefixSuffix(String s)
    {
        int n = s.length();
    
        int lps[] = new int[n];
        
        // lps[0] is always 0
        lps[0] = 0; 
    
        // length of the previous
        // longest prefix suffix
        int len = 0;
    
        // the loop calculates lps[i]
        // for i = 1 to n-1
        int i = 1;
        while (i < n)
        {
            if (s.charAt(i) == s.charAt(len))
            {
                len++;
                lps[i] = len;
                i++;
            }
            
             // (pat[i] != pat[len])
            else
            {
                // This is tricky. Consider
                // the example. AAACAAAA
                // and i = 7. The idea is
                // similar to search step.
                if (len != 0)
                {
                    len = lps[len-1];
    
                    // Also, note that we do
                    // not increment i here
                }
                
                // if (len == 0)
                else 
                {
                    lps[i] = 0;
                    i++;
                }
            }
        }
    
        int res = lps[n-1];
    
        // Since we are looking for
        // non overlapping parts.
        return (res > n/2)? n/2 : res;
    }
    
    // Driver program 
    public static void main (String[] args) 
    {
        String s = "abcab";
        System.out.println(longestPrefixSuffix(s));
    }
}

// This code is contributed by Anant Agarwal.

Output:

2

Please refer computeLPSArray() of KMP search for explanation.

Time Complexity : O(n)
Auxiliary Space : O(n)


A Coding Enthusiast Rails Developer

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

GATE CS Corner    Company Wise Coding Practice

Recommended Posts:



4 Average Difficulty : 4/5.0
Based on 1 vote(s)