LeetCode断字,在线评判失败但通过在线测试

时间:2016-01-07 12:26:42

标签: c++ dynamic-programming undefined-behavior word-break

我在做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];
    }
};

当我在线评判时,它在测试中失败了:&#34; &#34; AAAAAAA&#34; [&#34; aaaa&#34;,&#34; aa&#34;]&#34;,我的代码输出为true,预期答案为false。但是,如果我在在线测试中运行它,它会给出正确的输出。此外,它在我自己的使用clang ++的虚拟机上运行良好。

在线评判和在线测试之间的区别在于每个在线测试只是一个测试。在线判断包含许多测试,如果任何测试失败,将会失败。因此,我的代码问题可能是这样的:在除了&#34; aaaaaaa&#34;之外的某些测试中,它给出正确的输出但是会引起一些潜在的问题。这就是为什么我的代码会失败的原因&#34; aaaaaaa&#34;。但是,如果我只是运行这个单一的测试,那很好。

leetcode网站说它可能是因为我的代码有一些未定义的行为。之前的测试用例可能会影响后者。我不知道以前的测试用例是什么,并且没有想到这里的任何人都知道它。但我认为只要我的代码中存在问题,就有人可以找到它。

我认为这次问题非常明确。

1 个答案:

答案 0 :(得分:1)

此行参数的顺序错误vector<bool> sepable(false, strlen);它应该是vector<bool> sepable(strlen,false);向量的长度首先是默认值而false是隐式转换为int所以长度设置为0给出未定义的行为