0
下面的代碼基本上得到了一個字符串的排列。所以我預計時間複雜度爲O(N!)
。 當不使用HashSet來檢查字符串是否已經添加時,運行以下帶參數「abc」的代碼將顯示循環36而不是3!
次。正好N!時間的排列邏輯?
static void Main(string[] args)
{
generated = new HashSet<string>();
var test = getA(args[0]);
int i = 1;
foreach (var s in test)
{
Console.WriteLine($"{i}:{s}");
i++;
}
}
static HashSet<string> generated;
private static IEnumerable<string> getA(string v)
{
if (v.Length <= 1)
{
yield return v;
}
else
{
for (var i = 0; i < v.Length; i++)
{
var c = v[i];
var s = v.Remove(i, 1);
Console.WriteLine($" i:{i} v:{v} c:{c} s:{s}");
foreach (var t in getA(s))
{
Console.WriteLine($" t:{t}");
for (var k = 0; k < t.Length; k++)
{
if (c != t[k])
{
var result = t.Insert(k, c.ToString());
//if (!generated.Contains(result))
{
generated.Add(result);
yield return result;
}
}
}
//if (!generated.Contains(t + c))
{
generated.Add(t + c);
yield return t + c;
}
}
}
}
}