我有一个关于c++字符串存储的问题。我想知道为什么这两种方法得到的答案不同。
这是一个Leetcode问题#22生成括号:
第一个是我最终修改的答案,最终得到了leetcode编译器接受的正确答案。
两路输入与"2"和答案可能是"(())","()()")
1。正确的
class Solution {
public:
void matchParenthesis(vector<string> &result,string thisResult,int n ,int left , int right){
//left= 已使用“(”個數
if(left==n && right==n){
result.push_back(thisResult);
thisResult="";
}else{
if(left<n && left>=0){
matchParenthesis(result,thisResult+"(",n,left+1,right);
}
if(right<left && right<n){
matchParenthesis(result,thisResult+")",n,left,right+1);
}
//cout<<thisResult<<"n";
}
}
vector<string> generateParenthesis(int n) {
vector<string> result;
string thisResult;
matchParenthesis(result,thisResult,n,0,0);
return result;
}
};
2。这是我在接受之前写的错误代码。
class Solution {
public:
void matchParenthesis(vector<string> &result,string thisResult,int n ,int left , int right){
//left= 已使用“(”個數
if(left==n && right==n){
result.push_back(thisResult);
thisResult="";
}else{
if(left<n && left>=0){
thisResult+="(";
matchParenthesis(result,thisResult,n,left+1,right);
}
if(right<left && right<n){
thisResult+=")";
matchParenthesis(result,thisResult,n,left,right+1);
}
//cout<<thisResult<<"n";
}
}
vector<string> generateParenthesis(int n) {
vector<string> result;
string thisResult;
matchParenthesis(result,thisResult,n,0,0);
return result;
}
};
输入:2和输出:("(())","(()()"]
不同的代码如下"else"部分:1 .
if(left<n && left>=0){
matchParenthesis(result,thisResult+"(",n,left+1,right);
}
if(right<left && right<n){
matchParenthesis(result,thisResult+")",n,left,right+1);
}
if(left<n && left>=0){
thisResult+="(";
matchParenthesis(result,thisResult,n,left+1,right);
}
if(right<left && right<n){
thisResult+=")";
matchParenthesis(result,thisResult,n,left,right+1);
}
我想知道为什么递归中的第一个解参数
matchParenthesis(result,thisResult+"(",n,left+1,right);
参数thisReuslt+"("
与方案2不同,方案2存储"("到thisResult如thisResult+="(";
,然后设置第二个参数如matchParenthesis(result,thisResult,n,left+1,right);
在我的认知中,他们是一样的"首先插入"("到原始参数thisResult "并直接设置参数&;thisresult &;+"("。但似乎不一样,我想知道有什么不同。
谢谢stackoverflow,谢谢大家。对不起,我的英语很差。
这个问题可能是一个实例,说明为什么在调试时保持开放的心态很重要。不要过于关注你认为的问题所在。对错误持开放态度,并寻找其他解释。
我想知道为什么递归中的第一个解参数
matchParenthesis(result,thisResult+"(",n,left+1,right);
参数
thisReuslt+"("
与方案2不同,方案2存储"("到thisResult如thisResult+="(";
,然后设置第二个参数如matchParenthesis(result,thisResult,n,left+1,right);
既然您关注的是这个参数(更确切地说,是"argument"),那么您的困惑就不足为奇了,因为您是对的——在参数中没有区别到这个递归调用。区别在于之后的这个函数调用。如果您一直关注这个参数,您可能永远不会看到bug的原因。
递归调用matchParenthesis
之后,第一个解决方案中的thisResult
的值没有改变,但在第二个解决方案中它有一个额外的"("
。如果这是函数的结尾,那就没有问题了,但是还有更多的代码要完成。执行仍然可能导致另一个递归调用。假设thisResult
最初是"("
。在第一个解决方案中,第二个递归调用是
// thisResult is "("
matchParenthesis(result,thisResult+")",n,left,right+1);
//same as: matchParenthesis(result,"()",n,left,right+1);
在第二个解决方案中,这个调用是
// thisResult is "((".
thisResult+=")";
// thisResult is now "(()".
matchParenthesis(result,thisResult,n,left,right+1);
// same as: matchParenthesis(result,"(()",n,left,right+1);
这不是第一次调用,而是在执行过程中存在差异的地方。
查看"else"子句。在第一个"if"中修改thisResult,然后进入第二个"if",但是thisResult现在有了一个额外的字符。对于final,您永远不会修改thisResult。