Given three strings <code>a</code>, <code>b</code>, and <code>c</code>, your task is to find a string that has the<strong> minimum</strong> length and contains all three strings as <strong>substrings</strong>.
<p>If there are multiple such strings, return the<em> </em><strong>lexicographically<em> </em>smallest </strong>one.</p>

<p>Return <em>a string denoting the answer to the problem.</em></p>

<p><strong>Notes</strong></p>

<ul>
	<li>A string <code>a</code> is <strong>lexicographically smaller</strong> than a string <code>b</code> (of the same length) if in the first position where <code>a</code> and <code>b</code> differ, string <code>a</code> has a letter that appears <strong>earlier </strong>in the alphabet than the corresponding letter in <code>b</code>.</li>
	<li>A <strong>substring</strong> is a contiguous sequence of characters within a string.</li>
</ul>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> a = &quot;abc&quot;, b = &quot;bca&quot;, c = &quot;aaa&quot;
<strong>Output:</strong> &quot;aaabca&quot;
<strong>Explanation:</strong>  We show that &quot;aaabca&quot; contains all the given strings: a = ans[2...4], b = ans[3..5], c = ans[0..2]. It can be shown that the length of the resulting string would be at least 6 and &quot;aaabca&quot; is the lexicographically smallest one.</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> a = &quot;ab&quot;, b = &quot;ba&quot;, c = &quot;aba&quot;
<strong>Output:</strong> &quot;aba&quot;
<strong>Explanation: </strong>We show that the string &quot;aba&quot; contains all the given strings: a = ans[0..1], b = ans[1..2], c = ans[0..2]. Since the length of c is 3, the length of the resulting string would be at least 3. It can be shown that &quot;aba&quot; is the lexicographically smallest one.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= a.length, b.length, c.length &lt;= 100</code></li>
	<li><code>a</code>, <code>b</code>, <code>c</code> consist only of lowercase English letters.</li>
</ul>

import itertools

class Solution:
    def minimumString(self, a: str, b: str, c: str) -> str:
        # print("aca" < "ca")
        # strings = sorted([a, b, c])
        # print(strings)
        # test_1 = strings[0]
        # w = strings[1]
        tests = []
        min_length = len(a) + len(b) + len(c)
        for strings in itertools.permutations([a, b, c]):
            test_1 = strings[0]
            for w in (strings[1], strings[2]):
                added = False
                for i in range(0, len(test_1)+1):
                    len_substr_in_common = min(len(test_1) - i, len(w))
                    # print("comparing", test_1[i:i+len_substr_in_common] , w[:len_substr_in_common])
                    if test_1[i:i+len_substr_in_common] == w[:len_substr_in_common]:
                        # print("found match")
                        test_1 = test_1 + w[len_substr_in_common:]
                        added = True
                        break
                if not added: test_1 += w
                # print("inter", test_1)
            if len(test_1) < min_length:
                min_length = len(test_1)
                tests = []
            if len(test_1) == min_length:
                tests.append(test_1)
            # print(test_1)
        # test_2 = strings[0]
        # for w in (strings[2], strings[1]):
        #     added = False
        #     for i in range(max(len(test_2)-len(w), 0), len(test_2)+1):
        #         len_substr_in_common = len(test_2) - i
        #         print("comparing", test_2[-len_substr_in_common:] , w[:len_substr_in_common])
        #         if test_2[-len_substr_in_common:] == w[:len_substr_in_common]:
        #             test_2 = test_2 + w[len_substr_in_common:]
        #             added = True
        #             break
        #     if not added: test_1 += w
        # print(test_2)
        return min(tests)
        

344