Longest common substring using dynamic programming
Sorry I've not examined too closely your code to make a comment, but just considering the problem as stated and the fact you are using Py3, I would probably solve it with itertools.accumulate, e.g.:

&gt;&gt;&gt; import itertools as it
&gt;&gt;&gt; import operator as op
&gt;&gt;&gt; ss = ["thisishello", "dfdsishdllo", "ashsisdsdsf"]
&gt;&gt;&gt; i, l = max(enumerate(it.accumulate(it.chain([0], zip(*ss)),
...                      lambda x, y: (x+1)*(len(set(y)) == 1))), key=op.itemgetter(1))
&gt;&gt;&gt; i, l, ss[0][i-l:i]
(6, 3, 'sis')


Should work well for an arbitrary number of strings as it uses generators and doesn't create any intermediate data structures.
It does use the fact that a False equates to 0 with len(set(y)) == 1 but if that is uncomfortable you could simply replace with 1 if len(set(y)) == 1 else 0.

Note: I still wish that itertools.accumulate had an initial value argument much like functools.reduce has, would avoid the need of chaining the initial value to the iterable.