LeetCode Word Break,未通过在线评委,但通过了在线测试

LeetCode Word Break, fail on Online Judge but pass Online test

本文关键字:在线 通过了 在线测试 Word Break LeetCode      更新时间:2023-10-16

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

当我运行在线判断时,它在测试中失败了:"aaaaaa"["aaaa","aa"],我的代码输出为true,预期答案为false。然而,如果我在在线测试中运行它,它会给出正确的输出。此外,它在我自己的带有clang++的虚拟机上运行良好。

在线评委和在线测试的区别在于,每次在线测试只是一次测试。在线评判包含许多测试,如果任何测试失败,都将失败。因此,我的代码的问题可能是这样的:在"aaaaaa"之外的一些测试中,它给出了正确的输出,但会导致一些潜在的问题。这就是为什么我的代码会在"aaaaaa"上失败的原因。然而,如果我只是运行这个单独的测试,它是好的。

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

我认为这次问题很清楚。

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

相关文章: