产生所有的算法

时间:2016-08-09 04:38:48

标签: c# .net algorithm

我想知道我这里有什么错误

private static string ReplaceAt(string s, int i, char c)
{
    if(s.Length < 1) // corner case
        return string.Empty;
    var sb = new StringBuilder(s);
    sb[i] = c;
    return sb.ToString();       
}


// returns all strings formed from replacing a digit of number with a different digit   
public static IEnumerable<string> SingleDigitReplacements(string number)
{
    for(int i = 0; i < number.Length; ++i)
        foreach(char c in _Digits.Where(d => number[i] != d))
            yield return ReplaceAt(number,i,c);
}

// returns all strings formed from replacing k digits of number with different digits
public static IEnumerable<string> KDigitReplacements(string number, int k)
{
    var nums = new HashSet<string>();
    nums.Add(number);
    for(int i = 0; i < k; ++i)
    {
        var inner = new HashSet<string>();
        foreach(var num in nums)
            foreach(string replacement in SingleDigitReplacements(num))
                inner.Add(replacement);
        foreach(string replacement in inner)
            nums.Add(replacement);
    }
    foreach(string num in nums)
        yield return num;
}

例如,如果我打电话

KDigitReplacements("01", 1)

会产生

"11", "21", ..., "91" (all replacements of 1st digit)
"00", "02", ..., "09" (all replacements of 2nd digit)

KDigitReplacements("01", 2)

将产生上述加上对上述每个字符串应用相同过程的组合结果。但是,我不想要任何重复。我这样做的方式非常笨重,但我无法想到更好的方式。

1 个答案:

答案 0 :(得分:0)

一般来说,这是组合学的问题,因此你必须采取所有选择。

首先,您可以缩短代码。 Hashset实现了接口IEnumerable(参见https://msdn.microsoft.com/de-de/library/bb359438(v=vs.110).aspx),因此不是

foreach(string num in nums)
    yield return num;

return nums

同样的

foreach(string replacement in SingleDigitReplacements(num))
            inner.Add(replacement);
    foreach(string replacement in inner)
        nums.Add(replacement);

改为写

foreach(string replacement in SingleDigitReplacements(num))
            nums.Add(replacement);

第二:如果您需要效果,请查找Parallel.ForEachParallel.For

问候诺兰