Here's another solution:
First we need to do some preprocessing on the string array.
Let's define C as the subset of all the characters composing all the strings in the array.
For each character in C, we are going to keep track of each string containing that character and its position in that string + a Boolean value stating if its the last char in that string. This can be done using a dictionary.
For example, let's say our array is ['one', 'two', 'three']. Our dictionary would look something like this:
'o': (0, 0, false),(1,2,true)
't': (1, 0, false),(2,0,false)
'n': (0, 1, false)
'e': (2, 3, false),(2,4, true)
'h': (2, 1, false)
'r': (2, 2, false)
'w': (2, 1, false)
Next we are going to use DFS and Dynamic Programming.
Basically, whenever you visit an edge, you check the parent and the child on the dict to see if they compose a substring and you store that information.
Using this method, you can easily detect all recurrence of every string in the array.
Building the preprocessing table can be done in o(L) where L is the sum of the lengths of all the strings in the array.
Discovering all recurrence can be done in O(m * k) where m is the number of edges (and not the number of nodes, as a node can be discovered multiple times) and k is the number of strings.
The implementation can be a little tricky and there are some pitfalls you should avoid.