Мне задали этот вопрос сегодня в интервью.
Я всегда пропускал этот вопрос в Cracking The Coding, потому что думал, что это глупый вопрос для интервью. Интервьюер не разделял моего мнения.
Ниже приведено решение, которое я мог бы найти в интервью. Интервьюер искал более эффективный метод, который уже был приведен выше. Он передал меня, хотя для этого решения.
//This method is recursive. It simply returns all the possible arrangements by going down
//and building all possible combinations of parenthesis arrangements by starting from "()"
//Using only "()" for n == 1, it puts one "()" before, one "()" after and one "()" around
//each paren string returned from the call stack below. Since, we are adding to a set, the
//set ensure that any combination is not repeated.
private HashSet<string> GetParens(int num)
{
//If num < 1, return null.
if (num < 1) return null;
//If num == 1, there is only valid combination. Return that.
if (num == 1) return new HashSet<string> {"()"};
//Calling myself, by subtracting 1 from the input to get valid combinations for 1 less
//pair.
var parensNumMinusOne = GetParens(num - 1);
//Initializing a set which will hold all the valid paren combinations.
var returnSet = new HashSet<string>();
//Now generating combinations by using all n - 1 valid paren combinations one by one.
foreach (var paren in parensNumMinusOne)
{
//Putting "()" before the valid paren string...
returnSet.Add("()" + paren);
//Putting "()" after the valid paren string...
returnSet.Add(paren + "()");
//Putting paren pair around the valid paren string...
returnSet.Add("(" + paren + ")");
}
return returnSet;
}
Пространственная сложность другого более производительного решения O (1), но для этого O ( C n ), где C n - Каталонский номер .
Временная сложность этого кода такая же, как и у другого высокопроизводительного решения, аналогичного O ( C n ).