【发布时间】:2016-01-07 12:26:41
【问题描述】:
我在做 leetcode 139 的时候遇到了一个问题,分词。
给定一个字符串 s 和一个单词字典 dict,确定 s 是否可以分割成一个或多个字典单词的空格分隔序列。 (每个字典词可以多次使用。)
例如,给定 s = "leetcode", dict = ["leet", "code"].
返回 true 因为“leetcode”可以被分割为“leet code”。
我使用基本的动态规划算法,但可能以与互联网上流行的不同的方式实现它。 代码如下:
class Solution {
public:
bool wordBreak(string s, unordered_set<string>& wordDict) {
int strlen = s.length();
if(0 == strlen) return true;
vector<bool> sepable(false, strlen);
for(int i = 0; i < strlen; ++i) {
if(wordDict.count(s.substr(0,i+1)) > 0) {
sepable[i] = true;
continue;
}
for(int j = 0; j < i; ++j) {
if(sepable[j] && wordDict.count(s.substr(j+1,i-j)) > 0) {
sepable[i] = true;
break;
}
}
}
return sepable[strlen-1];
}
};
当我运行在线判断时,它在测试中失败:““aaaaaaa”[“aaaa”,“aa”]”,我的代码输出为真,预期答案为假。但是,如果我在在线测试中运行它,它会给出正确的输出。此外,它在我自己的带有 clang++ 的虚拟机上运行良好。
在线评委和在线测试的区别在于,每个在线测试只有一个测试。在线法官包含许多测试,如果任何一个测试失败,就会失败。所以我的代码的问题可能是这样的:在“aaaaaaa”以外的一些测试中,它给出了正确的输出但会导致一些潜在的问题。这就是为什么我的代码会在“aaaaaaa”上失败。但是,如果我只运行这个单一的测试,那就没问题了。
leetcode 网站说这可能是因为我的代码有一些未定义的行为。前一个测试用例可能会影响后一个测试用例。我不知道以前的所有测试用例是什么,没想到这里有人知道。但我觉得只要我的代码有问题,总有人能找到的。
我觉得这次的问题很清楚了。
【问题讨论】:
-
除非您发布minimal reproducible example,否则没有人能够复制此内容。
-
如果我为它写一个测试用例让每个人都在自己的机器上测试是没有用的。正如我所说,它在我的本地虚拟机上运行良好,我相信它也可以在其他本地机器上运行。但它无法通过 leetcode 在线判断。这就是问题所在。
-
你认为为什么有人会做出这样的努力?我给了你一个很好的提示,关于在这里提出一个有效的好问题。因此,如果您不在乎,我也不会... 关于在线法官,这经常被误解为这里的任何人都会了解他们的内部运作方式。所以基本上你的问题是无法回答的。
-
我同意 πάντα ῥεῖ,但我想补充一点,最好编辑您的问题,使其包含问题陈述,这样我们就不必依赖外部链接.除此之外,声明并不十分明确。例如,字典单词可以重复使用吗?而且,我不明白在线测试和在线判断之间的区别。无论如何,我会说对于
"aaaaaaa" ["aaaa","aa"],我希望答案是错误的,所以我同意在线法官的意见。为什么你认为这是真的?如何将 7 个字母分成 4 个和 2 个一组? -
我觉得这次很清楚了。
标签: c++ dynamic-programming undefined-behavior word-break