我想知道我这里有什么错误
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)
将产生上述加上对上述每个字符串应用相同过程的组合结果。但是,我不想要任何重复。我这样做的方式非常笨重,但我无法想到更好的方式。
答案 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.ForEach或Parallel.For
问候诺兰