My function is supposed to essentially give the cartesian product of all the letters in a string with the caveat that you have to give the permutations of every equivalent of each character in a string (capital and lowercase for example). This is what I came up with but I believe it has a time complexity of \$O(k^n)\$, \$k\$ being the number of equivalents of each character. import string from pprint import pprint equivs = {x[0]:x for x in list(zip(string.ascii_lowercase,string.ascii_uppercase))} st = "missifsffs" def perms(st): st = st.lower() out = [""] for let in st: out = [y+x for y in out for x in equivs[let]] return out print(perms("miss")) #['miss', 'misS', 'miSs', 'miSS', 'mIss', 'mIsS', 'mISs', 'mISS', 'Miss', 'MisS', 'MiSs', 'MiSS', 'MIss', 'MIsS', 'MISs', 'MISS'] print(perms("okay")) #['okay', 'okaY', 'okAy', 'okAY', 'oKay', 'oKaY', 'oKAy', 'oKAY', 'Okay', 'OkaY', 'OkAy', 'OkAY', 'OKay', 'OKaY', 'OKAy', 'OKAY'] print(perms(st))