Wednesday, 27 Oct 2021

# Count unique substrings of a string S present in a wraparound string

Count unique substrings of a string S present in a wraparound string
Given a string S which is an infinite wraparound string of the string “abcdefghijklmnopqrstuvwxyz”, the task is to count the number of unique non-empty substrings of a string p are present in s.
Examples:

Input: S = “zab”Output: 6Explanation: All possible substrings are “z”, “a”, “b”, “za”, “ab”, “zab”.
Input: S = “cac”Output: 2Explanation: All possible substrings are “a” and “c” only.

Approach: Follow the steps below to solve the problemIterate over each character of the string
Initialize an auxiliary array arr[] of size 26, to store the current length of substring that is present in string S starting from each character of string P.
Initialize a variable, say curLen, which stores the length of substring present in P including the current character if the current character is not a part of the previous substring.
Initialize a variable, say ans, to store the unique count of non-empty substrings of p present in S.
Iterate over the characters of the string and check for the following two cases:
Check if the current character can be added with previous substring to form the required substring or not.
Add the difference of curLen and arr[curr] to ans if (curLen + 1) is greater than arr[curr] to avoid repetition of substrings.

Print the value of ans.
Below is the implementation of the above approach:

C++

#include
using namespace std;

int findSubstringInWraproundString(string p)
{

int ans = 0;

int curLen = 0;

int arr = { 0 };

for (int i = 0; i < (int)p.length(); i++) {            int curr = p[i] - 'a';                                       if (i > 0
&& (p[i – 1]
!= ((curr + 26 – 1) % 26 + ‘a’))) {
curLen = 0;
}

curLen++;

if (curLen > arr[curr]) {

ans += (curLen – arr[curr]);

arr[curr] = curLen;
}
}

cout