The Z-Algorithm solves the longest common prefix of string in a linear time. It can be used as substitutes of Suffix trees and suffix array for certain problems.
package strings; import java.util.Scanner; public class StringSimilarity { public static void solution1(){ Scanner sc = new Scanner(System.in); int num = sc.nextInt(); String input = null; char[] in = null; int len = 0; int pos=0; int overlap=0; for(int i=0; i<num; i++){ overlap=0; input = sc.next(); len = input.length(); in = input.toCharArray(); int[] z = new int[len]; /** This array will have LCP values **/ /** The Z-Algorithm: * Linear LCP calculation based on previous calculated lcp's **/ int L=0, R=0; int sum=0; for(int j=1; j<len; j++){ if(j>R){ L=R=j; while(R<len && in[R-L]==in[R]) R++; z[j]=R-L; R--; } else{ int k=j-L; if(z[k]<R-j+1) z[j]=z[k]; else{ L=j; while(R<len && in[R-L]==in[R]) R++; z[j]=R-L; R--; } } sum=sum+z[j]; } /*for(int ii:z) System.out.println(ii); */ System.out.println(sum+len); } } public static void main(String[] args){ StringSimilarity.solution1(); } }