首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#实现--“打印所有平衡括号的组合”

C#实现--“打印所有平衡括号的组合”
EN

Stack Overflow用户
提问于 2017-03-14 05:31:57
回答 1查看 349关注 0票数 1

我在Valid Permutation of Parenthesis中实现了多源洗脱剂的java代码。

我的C#代码:

代码语言:javascript
复制
public static void CombiParentheses(int open, int close, StringBuilder str)
{
    if (open == 0 && close == 0)
    {
        Console.WriteLine(str.ToString());
        str.Clear();
    }
    if (open > 0) //when you open a new parentheses, then you have to close one parentheses to balance it out.
    {                
        CombiParentheses(open - 1, close + 1, str.Append("{"));
    }
    if (close > 0)
    {                
        CombiParentheses(open , close - 1, str.Append("}"));
    }
}

然而,我却得到了错误的结果:

代码语言:javascript
复制
CombiParentheses(3, 0, tempString2);
{{{}}}
}{}}
}{}
}{{}}
}{}

是什么导致了C#和Java实现之间的差异?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-14 07:00:36

问题不在Java->C#翻译中,而是在将字符串转换为StringBuilder这一事实上。当你打电话的时候

代码语言:javascript
复制
str.Append("(");

您正在将"(“)附加到当前字符串生成器实例(str)中,并且当您这样做时。

代码语言:javascript
复制
CombiParentheses(open - 1, close + 1, str.Append("("));

在方法调用中传递实例本身,而不是新实例。

了解问题的一个简单方法:假设您正在打电话

代码语言:javascript
复制
CombiParentheses(2, 0, str);

当写入第二个输出字符串时,调用堆栈将被

代码语言:javascript
复制
CombiParentheses(2, 0, str):
    CombiParentheses(1, 1, str.Append("(")):
        CombiParentheses(0, 2, str.Append("(")):
            CombiParentheses(0, 1, str.Append(")")):
                CombiParentheses(0, 0, str.Append(")")); // StringBuilder was reset here!
        CombiParentheses(1, 0, str.Append(")")):
            CombiParentheses(0, 1, str.Append("(")):
                CombiParentheses(0, 0, str.Append(")"));

因为您使用的是单个字符串生成器实例,并且在调用堆栈进入之前就清除了它

代码语言:javascript
复制
CombiParentheses(1, 0, str.Append(")"));

下一个输出将与该调用的输出相匹配,就好像str上没有字符但没有,而不是您期望的输出(这就好像str上仍然有一个"(" )。

如果使用字符串,则在执行(string + ")")时,结果是一个新的字符串,而不是您修改的相同对象,因此问题不会出现,当您回到递归执行的早期CombiParentheses调用时,仍然有CombiParentheses调用接收的原始字符串。

您可以使用它,请在运行时看到它:

代码语言:javascript
复制
public static void CombiParentheses(int open, int close, StringBuilder str)
{
    Console.WriteLine("open: {0}; close: {1}; str: {2}", open, close, str.ToString());
    if (open == 0 && close == 0)
    {
        Console.WriteLine(str.ToString());
        str.Clear();
    }

    if (open > 0)
    {
        CombiParentheses(open - 1, close + 1, str.Append("("));
    }

    if (close > 0)
    {
        CombiParentheses(open, close - 1, str.Append(")"));
    }
}

public static void CombiParenthesesFixed(int open, int close, string str)
{
    Console.WriteLine("open: {0}; close: {1}; str: {2}", open, close, str);
    if (open == 0 && close == 0)
    {
        Console.WriteLine(str);
    }

    if (open > 0)
    {
        CombiParentheses(open - 1, close + 1, str + "(");
    }

    if (close > 0)
    {
        CombiParentheses(open, close - 1, str + ")");
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42778403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档