c++中这两种存储字符串的方式有什么不同?



我有一个关于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。

    相关内容

    • 没有找到相关文章

    最新更新