Sum of similarities of string with all of its suffixes
Last Updated :
12 Sep, 2022
Given a string str, the task is to find the sum of the similarities of str with each of its suffixes.
The similarity of strings A and B is the length of the longest prefix common to both the strings i.e. the similarity of “aabc” and “aab” is 3 and that of “qwer” and “abc” is 0.
Examples:
Input: str = “ababa”
Output: 9
The suffixes of str are “ababa”, “baba”, “aba”, “ba” and “a”. The similarities of these strings with the original string “ababa” are 5, 0, 3, 0 & 1 respectively.
Thus, the answer is 5 + 0 + 3 + 0 + 1 = 9.
Input: str = “aaabaab”
Output: 13
Approach: Compute Z-array using Z-algorithm – For a string str[0..n-1], Z array is of same length as string. An element Z[i] of Z array stores length of the longest substring starting from str[i] which is also a prefix of str[0..n-1]. The first entry of Z array is the length of the string.
Now, sum all the elements of the Z-array to get the required sum of the similarities.
Below is the implementation of the above approach:
C++
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void getZarr(string str, int n, int Z[])
{
int L, R, k;
L = R = 0;
for ( int i = 1; i < n; ++i) {
if (i > R) {
L = R = i;
while (R < n && str[R - L] == str[R])
R++;
Z[i] = R - L;
R--;
}
else {
k = i - L;
if (Z[k] < R - i + 1)
Z[i] = Z[k];
else {
L = i;
while (R < n && str[R - L] == str[R])
R++;
Z[i] = R - L;
R--;
}
}
}
}
int sumSimilarities(string s, int n)
{
int Z[n] = { 0 };
getZarr(s, n, Z);
int total = n;
for ( int i = 1; i < n; i++)
total += Z[i];
return total;
}
int main()
{
string s = "ababa" ;
int n = s.length();
cout << sumSimilarities(s, n);
return 0;
}
|
Java
public class GFG{
static void getZarr(String str, int n, int Z[])
{
int L, R, k;
L = R = 0 ;
for ( int i = 1 ; i < n; ++i) {
if (i > R) {
L = R = i;
while (R < n && str.charAt(R - L) == str.charAt(R))
R++;
Z[i] = R - L;
R--;
}
else {
k = i - L;
if (Z[k] < R - i + 1 )
Z[i] = Z[k];
else {
L = i;
while (R < n && str.charAt(R - L) == str.charAt(R))
R++;
Z[i] = R - L;
R--;
}
}
}
}
static int sumSimilarities(String s, int n)
{
int Z[] = new int [n] ;
getZarr(s, n, Z);
int total = n;
for ( int i = 1 ; i < n; i++)
total += Z[i];
return total;
}
public static void main(String []args)
{
String s = "ababa" ;
int n = s.length();
System.out.println(sumSimilarities(s, n));
}
}
|
Python3
def getZarr(s, n, Z):
L, R, k = 0 , 0 , 0
for i in range (n):
if i > R:
L, R = i, i
while R < n and s[R - L] = = s[R]:
R + = 1
Z[i] = R - L
R - = 1
else :
k = i - L
if Z[k] < R - i + 1 :
Z[i] = Z[k]
else :
L = i
while R < n and s[R - L] = = s[R]:
R + = 1
Z[i] = R - L
R - = 1
def sumSimilarities(s, n):
Z = [ 0 for i in range (n)]
getZarr(s, n, Z)
total = n
for i in range (n):
total + = Z[i]
return total
s = "ababa"
n = len (s)
print (sumSimilarities(s, n))
|
C#
using System;
public class GFG{
static void getZarr( string str, int n, int []Z)
{
int L, R, k;
L = R = 0;
for ( int i = 1; i < n; ++i) {
if (i > R) {
L = R = i;
while (R < n && str[R - L] == str[R])
R++;
Z[i] = R - L;
R--;
}
else {
k = i - L;
if (Z[k] < R - i + 1)
Z[i] = Z[k];
else {
L = i;
while (R < n && str[R - L] == str[R])
R++;
Z[i] = R - L;
R--;
}
}
}
}
static int sumSimilarities( string s, int n)
{
int []Z = new int [n] ;
getZarr(s, n, Z);
int total = n;
for ( int i = 1; i < n; i++)
total += Z[i];
return total;
}
static public void Main (){
string s = "ababa" ;
int n = s.Length;
Console.WriteLine(sumSimilarities(s, n));
}
}
|
Javascript
<script>
function getZarr(str, n, Z)
{
let L, R, k;
L = R = 0;
for (let i = 1; i < n; ++i) {
if (i > R) {
L = R = i;
while (R < n && str[R - L] == str[R])
R++;
Z[i] = R - L;
R--;
}
else {
k = i - L;
if (Z[k] < R - i + 1)
Z[i] = Z[k];
else {
L = i;
while (R < n && str[R - L] == str[R])
R++;
Z[i] = R - L;
R--;
}
}
}
}
function sumSimilarities(s, n)
{
let Z = new Array(n);
Z.fill(0);
getZarr(s, n, Z);
let total = n;
for (let i = 1; i < n; i++)
total += Z[i];
return total;
}
let s = "ababa" ;
let n = s.length;
document.write(sumSimilarities(s, n));
</script>
|
Complexity Analysis
- Time Complexity: ON)
- Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...