Find the Suffix Array of given String with no repeating character
Last Updated :
24 Feb, 2022
Given a string str of size N, the task is to find the suffix array of the given string.
Note: A suffix array is a sorted array of all suffixes of a given string.
Examples:
Input: str = "prince"
Output: 4 5 2 3 0 1
Explanation: The suffixes are
0 prince 4 ce
1 rince Sort the suffixes 5 e
2 ince ----------------> 2 ince
3 nce alphabetically 3 nce
4 ce 0 prince
5 e 1 rince
Input: str = "abcd"
Output: 0 1 2 3
Approach: The methods of suffix array finding for any string are discussed here. In this article, the focus is on finding suffix array for strings with no repeating character. It is a simple implementation based problem. Follow the steps mentioned below to solve the problem:
- Count occurrence of each character.
- Find prefix sum of it.
- Find start array by start[0] = 0, start[i+1] = prefix[i] for all i > 0 .
- Find start array containing the index of the substring (suffix) with starting character of the respective column.
Follow the illustration below for better understanding.
Illustration:
Consider string "prince":
Given below is the suffix table
char | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
count | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
prefix | 0 | 0 | 1 | 1 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 4 | 4 | 5 | 5 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
start | 0 | 0 | 0 | 1 | 1 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 4 | 4 | 5 | 5 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
For char 'r' start value is 5 .
Implies substring (suffix) starting with char 'r' i.e. "rince" has rank 5 .
Rank is position in suffix array. ( 1 "rince" ) implies 5th position in suffix array ), refer first table.
Similarly, start value of char 'n' is 3 . Implies ( 3 "nce" ) 3rd position in suffix array .
Below is the implementation of the above approach
C++
// C++ code to implement above approach
#include <bits/stdc++.h>
using namespace std;
// Function to calculate the suffix array
void suffixArray(string str, int N)
{
// arr[] is array to count
// occurrence of each character
int arr[30] = { 0 };
for (int i = 0; i < N; i++) {
arr[str[i] - 'a']++;
}
// Finding prefix count of character
for (int i = 1; i < 30; i++) {
arr[i] = arr[i] + arr[i - 1];
}
int start[30];
start[0] = 0;
for (int i = 0; i < 29; i++) {
start[i + 1] = arr[i];
}
int ans[N] = { 0 };
// Iterating string in reverse order
for (int i = N - 1; i >= 0; i--) {
// Storing suffix array in ans[]
ans[start[str[i] - 'a']] = i;
}
for (int i = 0; i < N; i++)
cout << ans[i] << " ";
}
// Driver code
int main()
{
string str = "prince";
int N = str.length();
suffixArray(str, N);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG {
// Function to calculate the suffix array
static void suffixArray(String str, int N)
{
// arr[] is array to count
// occurrence of each character
int arr[] = new int[30];
for (int i = 0; i < N; i++) {
arr[str.charAt(i) - 'a']++;
}
// Finding prefix count of character
for (int i = 1; i < 30; i++) {
arr[i] = arr[i] + arr[i - 1];
}
int start[] = new int[30];
start[0] = 0;
for (int i = 0; i < 29; i++) {
start[i + 1] = arr[i];
}
int ans[] = new int[N];
// Iterating string in reverse order
for (int i = N - 1; i >= 0; i--) {
// Storing suffix array in ans[]
ans[start[str.charAt(i) - 'a']] = i;
}
for (int i = 0; i < N; i++)
System.out.print(ans[i] + " ");
}
// Driver code
public static void main (String[] args)
{
String str = "prince";
int N = str.length();
suffixArray(str, N);
}
}
// This code is contributed by hrithikgarg03188
Python3
# Python code for the above approach
# Function to calculate the suffix array
def suffixArray(str, N):
# arr[] is array to count
# occurrence of each character
arr = [0] * 30
for i in range(N):
arr[ord(str[i]) - ord('a')] += 1
# Finding prefix count of character
for i in range(1, 30):
arr[i] = arr[i] + arr[i - 1]
start = [0] * 30
start[0] = 0
for i in range(29):
start[i + 1] = arr[i]
ans = [0] * N
# Iterating string in reverse order
for i in range(N - 1, 0, -1):
# Storing suffix array in ans[]
ans[start[ord(str[i]) - ord('a')]] = i
for i in range(N):
print(ans[i], end=" ")
# Driver code
str = "prince"
N = len(str)
suffixArray(str, N)
# This code is contributed by gfgking
C#
// C# code to implement above approach
using System;
class GFG
{
// Function to calculate the suffix array
static void suffixArray(string str, int N)
{
// arr[] is array to count
// occurrence of each character
int[] arr = new int[30];
for (int i = 0; i < N; i++) {
arr[str[i] - 'a']++;
}
// Finding prefix count of character
for (int i = 1; i < 30; i++) {
arr[i] = arr[i] + arr[i - 1];
}
int[] start = new int[30];
start[0] = 0;
for (int i = 0; i < 29; i++) {
start[i + 1] = arr[i];
}
int[] ans = new int[N];
// Iterating string in reverse order
for (int i = N - 1; i >= 0; i--) {
// Storing suffix array in ans[]
ans[start[str[i] - 'a']] = i;
}
for (int i = 0; i < N; i++) {
Console.Write(ans[i]);
Console.Write(" ");
}
}
// Driver code
public static int Main()
{
string str = "prince";
int N = str.Length;
suffixArray(str, N);
return 0;
}
}
// This code is contributed by Taranpreet
JavaScript
<script>
// JavaScript code for the above approach
// Function to calculate the suffix array
function suffixArray(str, N) {
// arr[] is array to count
// occurrence of each character
let arr = new Array(30).fill(0);
for (let i = 0; i < N; i++) {
arr[str[i].charCodeAt(0) - 'a'.charCodeAt(0)]++;
}
// Finding prefix count of character
for (let i = 1; i < 30; i++) {
arr[i] = arr[i] + arr[i - 1];
}
let start = new Array(30)
start[0] = 0;
for (let i = 0; i < 29; i++) {
start[i + 1] = arr[i];
}
let ans = new Array(N).fill(0)
// Iterating string in reverse order
for (let i = N - 1; i >= 0; i--) {
// Storing suffix array in ans[]
ans[start[str[i].charCodeAt(0) - 'a'.charCodeAt(0)]] = i;
}
for (let i = 0; i < N; i++)
document.write(ans[i] + " ")
}
// Driver code
let str = "prince";
let N = str.length;
suffixArray(str, N);
// This code is contributed by Potta Lokesh
</script>
Time Complexity: O(N)
Auxiliary Space: O(N)
Similar Reads
First non-repeating character of given string Given a string s of lowercase English letters, the task is to find the first non-repeating character. If there is no such character, return '$'.Examples: Input: s = "geeksforgeeks"Output: 'f'Explanation: 'f' is the first character in the string which does not repeat.Input: s = "racecar"Output: 'e'Ex
9 min read
Queries to find the last non-repeating character in the sub-string of a given string Given a string str, the task is to answer Q queries where every query consists of two integers L and R and we have to find the last non-repeating character in the sub-string str[L...R]. If there is no non-repeating character then print -1.Examples: Input: str = "GeeksForGeeks", q[] = {{2, 9}, {2, 3}
11 min read
Find the last non repeating character in string Given a string str, the task is to find the last non-repeating character in it. For example, if the input string is "GeeksForGeeks", then the output should be 'r' and if the input string is "GeeksQuiz" then the output should be 'z'. if there is no non-repeating character then print -1.Examples: Inpu
5 min read
Find frequency of each character with positions in given Array of Strings Given an array, arr[] consisting of N strings where each character of the string is lower case English alphabet, the task is to store and print the occurrence of every distinct character in every string. Examples:Â Input: arr[] = { "geeksforgeeks", "gfg" }Output: Occurrences of: e = [1 2] [1 3] [1 1
7 min read
Count of all unique substrings with non-repeating characters Given a string str consisting of lowercase characters, the task is to find the total number of unique substrings with non-repeating characters. Examples: Input: str = "abba" Output: 4 Explanation: There are 4 unique substrings. They are: "a", "ab", "b", "ba". Input: str = "acbacbacaa" Output: 10 App
6 min read
Subsequences of given string consisting of non-repeating characters Given a string str of length N, the task is to print all possible distinct subsequences of the string str which consists of non-repeating characters only. Examples: Input: str = "abac" Output: a ab abc ac b ba bac bc c Explanation: All possible distinct subsequences of the strings are { a, aa, aac,
7 min read
Find the Longest Non-Prefix-Suffix Substring in the Given String Given a string s of length n. The task is to determine the longest substring t such that t is neither the prefix nor the suffix of string s, and that substring must appear as both prefix and suffix of the string s. If no such string exists, print -1. Example: Input: s = "fixprefixsuffix"Output: fix
7 min read
Find a word with highest number of repeating characters Given a string which contains multiple words, our task is to find the word which has highest number of repeating characters.Examples:Input: str = "hello world programming"Output: "programming"Explanation: The word "programming" has the highest number of repeating characters, with 'r', 'g', and 'm' e
7 min read
Find characters which when increased by K are present in String Given a string s of lowercase English alphabets and integer K. the task is to check if each character after increasing their ASCII by K is present in the string or not. Return only unique characters and the first index where they are present. Examples: Input: s = "dszepvaxuo", k = 3Output: {{1, 's'}
8 min read
Create a string with unique characters from the given N substrings Given an array arr[] containing N substrings consisting of lowercase English letters, the task is to return the minimum length string that contains all given parts as a substring. All characters in this new answer string should be distinct. If there are multiple strings with the following property p
11 min read