【问题标题】:Merged String Checker (invalid return)合并字符串检查器(无效返回)
【发布时间】:2022-11-12 14:04:25
【问题描述】:

任务:在工作面试中,你需要编写一个算法来检查给定的字符串 s 是否可以由其他两个字符串 part1 和 part2 组成。

限制是part1 和part2 中的字符必须与s 中的字符顺序相同。

面试官给你下面的例子,并告诉你从给定的测试用例中找出其余的。

例如:

'codewars' is a merge from 'cdw' and 'oears':

    s:  c o d e w a r s   = codewars
part1:  c   d   w         = cdw
part2:    o   e   a r s   = oears

但是当试图给函数值(“asab”、“ab”、“ac”)时,一切都很好,但是当(“aaaabaaaab”、“aaaba”、“aaaba”)或“ikrndvnodgybhqznxxghxffo”、“ikrdndgyhfo”时", "nvobqznxxghxf "),则函数返回无效。

bool is_merge(const string& s, const string& part1C, const string& part2C) {
    string part1 = part1C;
    string part2 = part2C;
    string res = "";
    auto p1 = part1.begin();
    auto p2 = part2.begin();
    if (s.length() == (part1.length() + part2.length())) {
        for (auto lp : s) {
            auto it1 = find(p1, part1.end(), lp);
            auto it2 = find(p2, part2.end(), lp);
            if (*it1 == lp) {
                res.push_back(lp);
                p1 = find(p1, part1.end(), lp);
            } else if (*it2 == lp) {
                res.push_back(lp);
                p2 = find(p2, part2.end(), lp);
            } else {
                return false;
            }
        }
    } else {
        return false;
    }

    return true;
}

【问题讨论】:

  • 作为开发人员,您的下一步将是输入输入并让您的调试器运行,并逐行逐行查看变量和流程,以尝试了解您的算法在哪里做了意想不到的事情。好在你已经知道一个失败的测试用例。
  • 在使用 *it1 (and *it2) 之前,我认为你测试 if (it1 != part1.end()) (and (it2 != part2.end())) 很有用
  • 请注意,在现实世界中,面试官可能更感兴趣的是你的解决问题的技巧,而不是你的解决方案。
  • @lakvak 这些字符串(“aaaabaaaab”、“aaaba”、“aaaba”)的预期结果是什么?

标签: c++ string find


【解决方案1】:

我不知道您对这些字符串有什么期望

("aaaabaaaab", "aaaba", "aaaba") 

或者对于这些字符串

("ikrndvnodgybhqznxxghxffo", "ikrdndgyhfo", "nvobqznxxghxf ")

以及最后一个字符串中是否存在拼写错误,其中存在尾随空格字符。

对于初学者,我认为最好在函数声明中使用 std::string_view 类而不是 std::string 类。

我可以建议如下的函数定义,如下面的演示程序所示

#include <iostream>
#include <string_view>
#include <set>
#include <iterator>

bool is_merge( std::string_view s, std::string_view part1C, std::string_view part2C )
{
    std::multiset<char> s1( std::begin( s ), std::end( s ) );
    std::multiset<char> s2( std::begin( part1C ), std::end( part1C ) );

    s2.insert( std::begin( part2C ), std::end( part2C ) );

    bool equal = s1 == s2;

    for (size_t i = 0, pos = 0; equal && i < std::size( part1C ); ++i, pos += equal )
    {
        pos = s.find( part1C[i], pos );

        equal = pos != std::string_view::npos;
    }

    for (size_t i = 0, pos = 0; equal && i < std::size( part2C ); ++i, pos += equal)
    {
        pos = s.find( part2C[i], pos );

        equal = pos != std::string_view::npos;
    }

    return equal;
}

int main()
{
    std::string s( "aaaabaaaab" );
    std::string part1C( "aaaba" );
    std::string part2C( "aaaba" );

    std::cout << std::boolalpha << is_merge( s, part1C, part2C ) << '
';

    std::cout << is_merge( "ikrndvnodgybhqznxxghxffo", "ikrdndgyhfo", "nvobqznxxghxf" )
        << '
';
}

程序输出为

true
true

在第二组字符串的最后一个字符串中,我删除了尾随空格字符。

虽然我不知道结果是否正确,因为问题中没有足够的信息给我。

而不是在函数中使用std::multiset,您可以使用例如std::map

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多