Suppose we have a string s, we have to find the number of distinct non-empty substrings of s.
So, if the input is like s = "abaa", then the output will be 8 because, the substrings are ["a", "b", "ab", "ba", "aa", "aba", "baa", "abaa"].
To solve this, we will follow these steps −
- trie := a new map
- n := size of s
- for i in range 0 to n - 1, do
- curr := trie
- for j in range i to n - 1, do
- c := s[j]
- if c not in curr, then
- curr[c] := a new map
- curr := curr[c]
- curr["*"] := True
- q := make a queue, and insert trie
- ans := 0
- while q is non-empty, do
- ans := ans + 1
- t := left item of q, and delete this item from q
- for each c in t, do
- if c is not same as "*", then
- insert t[c] at the end of q
- if c is not same as "*", then
- return ans - 1
Example
Let us see the following implementation to get better understanding −
from collections import deque
def solve(s):
trie = {}
n = len(s)
for i in range(n):
curr = trie
for j in range(i, n):
c = s[j]
if c not in curr:
curr[c] = {}
curr = curr[c]
curr["*"] = True
q = deque([trie])
ans = 0
while q:
ans += 1
t = q.popleft()
for c in t:
if c != "*":
q.append(t[c])
return ans - 1
s = "abaa"
print(solve(s))Input
"abaa"
Output
8