通过引用传递的字符串工作正常,否则不在 LCS 问题中

string passing by reference working fine else not in LCS problem

提问人:sandeep gaur 提问时间:6/21/2022 最后编辑:Ted Lyngmosandeep gaur 更新时间:6/21/2022 访问量:44

问:

如果我在函数方法中传递字符串引用,那么它工作正常,但如果我不通过引用传递它,那么测试用例就会失败,超过时间限制。 谁能告诉我我错过了什么?

工作代号:

class Solution {
public:
    int lcsUtil(string& s1,int ind1,string& s2,int ind2,vector< vector<int>>&dp){
        if(ind1<0 || ind2<0) return 0;
        
        if(dp[ind1][ind2] != -1) return dp[ind1][ind2];
        
        if(s1[ind1] == s2[ind2])
            return dp[ind1][ind2] = 1 + lcsUtil(s1,ind1-1,s2,ind2-1,dp);
        
        else 
            return dp[ind1][ind2] = 0 + max(lcsUtil(s1,ind1-1,s2,ind2,dp),lcsUtil(s1,ind1,s2,ind2-1,dp));
    }
    int longestCommonSubsequence(string text1, string text2) {
        vector< vector<int> > dp (text1.size(),vector<int>(text2.size(),-1));
        return lcsUtil(text1,text1.size()-1,text2,text2.size()-1,dp);

    }
};

不工作代码:

class Solution {
public:
    int lcsUtil(string s1,int ind1,string s2,int ind2,vector< vector<int>>&dp){
        if(ind1<0 || ind2<0) return 0;
        
        if(dp[ind1][ind2] != -1) return dp[ind1][ind2];
        
        if(s1[ind1] == s2[ind2])
            return dp[ind1][ind2] = 1 + lcsUtil(s1,ind1-1,s2,ind2-1,dp);
        
        else 
            return dp[ind1][ind2] = 0 + max(lcsUtil(s1,ind1-1,s2,ind2,dp),lcsUtil(s1,ind1,s2,ind2-1,dp));
    }
    int longestCommonSubsequence(string text1, string text2) {
        vector< vector<int> > dp (text1.size(),vector<int>(text2.size(),-1));
        return lcsUtil(text1,text1.size()-1,text2,text2.size()-1,dp);

    }
};

问题陈述

https://leetcode.com/problems/longest-common-subsequence/

C++ 动态 引用传递

评论

0赞 Ted Lyngmo 6/21/2022
“测试用例失败”——你明白失败的原因吗?如果是因为它超出了时间或内存消耗限制?不相关:由于您没有更改字符串,因此请使它们const string&
0赞 sandeep gaur 6/21/2022
超过时限。对于测试用例 -> leetcode.com/submissions/detail/726846540/testcase
0赞 sandeep gaur 6/21/2022
是的,我没有更改字符串,但如果它适用于第二种情况,我的意思是我在第二段代码中没有看到任何错误。
1赞 Ted Lyngmo 6/21/2022
当您按值传递 s 时,您每次都会复制它们。这需要时间(和内存)并解释超出的限制。您也可能因超出内存限制而失败。通过引用传递它们时,不会创建字符串的副本。请改为引用已存在的字符串。std::string
1赞 Paul Sanders 6/21/2022
复制通常涉及调用后台以存储复制的字符。当字符串超出范围时,会有相应的调用。如果通过引用传递字符串,则可以避免所有这些情况。stringmallocfree

答:

2赞 Ted Lyngmo 6/21/2022 #1

当你按值传递 s 时,就像你在第二个例子中所做的那样,你每次都会复制它们。这需要时间(和内存)并解释超出的限制。您也可能因超出内存限制而失败。通过引用传递它们时,不会创建字符串的副本。请改为引用已存在的字符串。std::string