首页 > 解决方案 > 为什么这会返回“NO”?

问题描述

我正在研究“HackerRank 面试准备工具包”,并且偶然发现了另一个用户的这个解决方案。解决方案不正确,HackerRank 将其视为“正确”,我想了解原因。

// find if there is a common substring
string twoStrings(string s1, string s2)
{
    int n;
    int m;
    const char* char_array1;
    const char* char_array2;
    unordered_map<char, char> map;

    n = s1.size();
    m = s2.size();
    char_array1 = s1.c_str();
    char_array2 = s2.c_str();

    for (int i = 0; i < n - 1; i++)
        map[char_array1[i]] = char_array1[i + 1];

    for (int i = 0; i < m; i++)
        if (map[char_array2[i]] != 0)
            return "YES";

    return "NO";
}

我传入的值是:

beetroots & sandals

代码返回“NO”,这是不正确的,因为两个单词中都出现了“s”。

标签: c++arraysstringdictionary

解决方案


为什么这会返回“NO”?

该函数返回"NO",因为填充的第一个循环map不考虑 - 的最后一个字符,s1因此在第二个for开始之前,map将包含b, e, t,r和的条目o

map['b'] = 'e'
map['e'] = 't'
map['t'] = 's'
map['r'] = 'o'
map['o'] = 't'

我怀疑这段代码的作者认为basic_string::size()返回基础字符数组中的元素数(即包括 null-terminator \0) - 但实际上返回字符数(嗯,元素数,不一定是字符,具体取决于关于正在使用的编码)。

该函数本身是完全错误的,因为它不执行任何与检查公共子字符串相关的逻辑 - 它只是检查是否s2存在任何字符s1(除了 的最后一个字符s1)。

解决方案不正确,HackerRank 将其视为“正确”,我想了解原因。

我能想到的唯一原因是 HackerRank 使用了一组不充分的测试用例——这很不寻常,因为它们往往擅长这种事情。


推荐阅读