public int MaxLength(IList <string> arr)
    {
        if (arr == null || arr.Count == 0)
        {
            return(0);
        }

        var filteredArray = arr.Where(x => x.Distinct().Count() == x.Length).ToArray();

        if (filteredArray.Length == 0)
        {
            return(0);
        }

        int totalUniqueChars = filteredArray.SelectMany(x => x.ToCharArray()).Distinct().Count();

        var soln = new SolnDS();

        this.MaxLengthHelper(filteredArray, soln, totalUniqueChars);
        return(soln.maxLength);
    }
    public void MaxLengthHelper(IList <string> currentArray, SolnDS soln, int TotalUniqueChars)
    {
        foreach (var item in currentArray)
        {
            if (soln.IsSafe(item))
            {
                soln.Add(item);

                if (soln.maxLength == TotalUniqueChars)
                {
                    return;
                }

                this.MaxLengthHelper(currentArray, soln, TotalUniqueChars);
            }

            // try next one.
        }

        // pop previous addition.
        soln.Remove();
    }