Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;vs Java记忆差异_Java_C++_Recursion_Dynamic Programming_Memoization - Fatal编程技术网

C++;vs Java记忆差异

C++;vs Java记忆差异,java,c++,recursion,dynamic-programming,memoization,Java,C++,Recursion,Dynamic Programming,Memoization,所以我一直在尝试解决单词break动态规划问题,这基本上意味着给定一个字符串字典和一个字符串,看看字典中的单词是否可以组合成字符串。例如,给定单词“applepenapple”和字典[“apple”,“pen”],它应该返回true 我有一个工作java解决方案,但是我正在努力提高C++技巧。我的问题是,尽管我的代码看起来与Java中的工作解决方案极为相似,但我在一个小测试用例中失败了,我不知道为什么 C++代码: bool wordBreak(string s, vector<strin

所以我一直在尝试解决单词break动态规划问题,这基本上意味着给定一个字符串字典和一个字符串,看看字典中的单词是否可以组合成字符串。例如,给定单词“applepenapple”和字典[“apple”,“pen”],它应该返回true

我有一个工作java解决方案,但是我正在努力提高C++技巧。我的问题是,尽管我的代码看起来与Java中的工作解决方案极为相似,但我在一个小测试用例中失败了,我不知道为什么

C++代码:

bool wordBreak(string s, vector<string> &wordDict) {
    vector<int> bArr(s.length(), -1);
    unordered_set<string> set(wordDict.begin(), wordDict.end());
    return wordBreak(s, bArr, 0, set);
}

bool wordBreak(string s, vector<int> &bArr, int start, unordered_set<string> &set) {
    if (start == s.length())
        return true;
    //If we have a memoized solution to this problem, avoid recurion
    if (bArr[start] != -1)
        return (bArr[start] == 1);
    for (int end = start + 1; end <= s.length(); end++) {
        if (set.count(s.substr(start, end)) && wordBreak(s, bArr, end, set)) {
            bArr[start] = 1;
            return bArr[start] == 1;
        }
    }
    bArr[start] = 0;
    return false;
}
bool断字(字符串s、向量和单词dict){
向量bArr(s.长度(),-1);
无序集合(wordDict.begin(),wordDict.end());
返回分词符(s,bArr,0,set);
}
布尔断字(字符串s、向量和巴尔、整数开始、无序集合和集合){
如果(开始==s.length())
返回true;
//如果我们对此问题有一个记忆化的解决方案,请避免再次发生
如果(巴尔[开始]!=-1)
返回(bArr[start]==1);

对于(int end=start+1;end我看到了一个潜在的问题。来自(我的重点):

公共字符串子字符串(int-beginIndex,int-endIndex)

返回作为此字符串的子字符串的新字符串。该子字符串从指定的beginIndex开始,并扩展到索引endIndex-1处的字符。因此,该子字符串的长度为endIndex beginIndex

示例:

"hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns "mile"
参数:

beginIndex-开始索引,包含在内

endIndex-结束索引,独占

发件人:

basic\u string substr(size\u type pos=0,size\u type count=npos)常量;

返回子字符串[pos,pos+count]。如果请求的子字符串超出了字符串的末尾,或者如果count==npos,则返回的子字符串为[pos,size())

参数

pos—要包含的第一个字符的位置

计数-子字符串的长度

在java中,你应该把索引作为第二个参数传递给<代码>字符串.String(…)< /C> >,但是在C++中,你应该把一个长度传递给<代码> Basic字符串:::子字符串(…)< />代码。但是,你正在做:

s.substr(start, end)

在这两种情况下

也许将C++调用调整为

s.substr(start, end - start)

行吗?

我发现了一个潜在的问题。来自(我的重点):

公共字符串子字符串(int-beginIndex,int-endIndex)

返回作为此字符串的子字符串的新字符串。该子字符串从指定的beginIndex开始,并扩展到索引endIndex-1处的字符。因此,该子字符串的长度为endIndex beginIndex

示例:

"hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns "mile"
参数:

beginIndex-开始索引,包含在内

endIndex-结束索引,独占

发件人:

basic\u string substr(size\u type pos=0,size\u type count=npos)常量;

返回子字符串[pos,pos+count]。如果请求的子字符串超出了字符串的末尾,或者如果count==npos,则返回的子字符串为[pos,size())

参数

pos—要包含的第一个字符的位置

计数-子字符串的长度

在java中,你应该把索引作为第二个参数传递给<代码>字符串.String(…)< /C> >,但是在C++中,你应该把一个长度传递给<代码> Basic字符串:::子字符串(…)< />代码。但是,你正在做:

s.substr(start, end)

在这两种情况下

也许将C++调用调整为

s.substr(start, end - start)

会工作吗?< /P>它似乎有编译错误。你确定你不是在运行程序的一个老版本吗?一些IDE会这么做。你也有一些警告,因为你在签入和无符号的int之间做比较,你真的不应该忽略C++中的警告。C++代码返回“苹果树”的假代码。带字典[“苹果”,“钢笔”]-请java C++ C++编写一个代替一个描述的方法。尝试从java到C++的逐行翻译不是一个好主意,反之亦然。你不是通过学习C++来学习,而是一种完全让事情出错的简单方法。例如,C++中的代码>子字符串< /代码>与Java中的<代码>子串< /代码>不一样。(正如另一条评论指出的那样)您不注意编译器关于“代码>未签名< /COD>”的警告。此外,变量名<代码> SET/COM>的用法不是一个好主意,因为在C++标准库中有一个<代码> STD::SET/CODE >,导致混淆代码。它似乎有编译错误。您确定您不是在运行一个老版本的Pro吗?有些IDES会这么做。你也有一些警告,因为你在签入和无符号的int之间做比较,你真的不应该忽略C++中的警告。C++代码返回“pApple”,用字典[Apple ],“Pink”返回false。-请java C++ C++编写一个代替一个描述的方法。尝试从java到C++的逐行翻译不是一个好主意,反之亦然。你不是通过学习C++来学习,而是一种完全让事情出错的简单方法。例如,C++中的代码>子字符串< /代码>与Java中的<代码>子串< /代码>不一样。(正如另一条评论指出的那样)您不注意编译器关于“代码>未签名< /代码>的警告。此外,变量名<代码> SET/COME >的用法不是一个好主意,因为在C++标准库中有一个<代码> STD::SET/CODE >,导致混淆代码。确认此错误测试用例。谢谢。一百万。测试用例,非常感谢。