【问题标题】:How to verify whether input 2 can be constructed using words in input 1 using Java?java - 如何使用Java验证输入2是否可以使用输入1中的单词构造?
【发布时间】:2016-04-07 03:16:16
【问题描述】:

假设我们有两个文本输入。 “input1”是小说中的一页。 “input 2”是一个随机句子“How do you do?”。我需要验证这个输入 2 是否可以使用输入 1 中的单词来构造。对于这个问题,我能想出的唯一解决方案就是这样。

步骤 0: 创建一个布尔标志并将其值设置为 true。

步骤 1: 将第一个输入拆分为标记并将每个单词在哈希图中出现的次数存储。

第 2 步:将第二个输入拆分为令牌并遍历令牌。

step3:在循环内部,检查当前token是否存在于map中。如果不是,则将布尔标志设置为 false 并退出循环。如果是,请检查从 Map 返回的条目的值。如果为零,则将布尔标志设置为 false 并退出循环。如果值为 1 或更大,则将其减 1 并继续循环。

step4:循环完成后,返回布尔标志的值。

如您所见,如果输入量很大,步骤 1 和步骤 3 可能需要很长时间。解决这个问题的替代方法有哪些,可以有更好的运行时间?

【问题讨论】:

    标签: java loops random boolean


    【解决方案1】:

    您正在成为“过早优化”的牺牲品(请查阅)。你的方法是合理的,实现一些东西,看看它是如何执行的。您会惊讶于 Java Map 的速度有多快,而且拆分成标记(单词)不会很耗时。

    只有在确定存在性能问题后才担心优化,然后仅优化分析工作确定为有问题的代码。任何其他方法都是在浪费您的时间,这比几万亿个 CPU 周期要昂贵得多。

    根据评论中的额外信息进行编辑:

    如果您知道目标短语(问题中的“随机句子”)总是比正文短很多,则可以进行改进。反转解法,将目标词放在Map 中,并在扫描正文时使用类似的算法。您的搜索空间会更小,您可以在正文中找到足够多的单词后立即停止。

    但是,只有当目标短语始终短于未明确指定的主文本时,这才会更快。对于指定数量级的文本大小(一页和一个句子),性能差异几乎无法衡量。

    【讨论】:

    • 这是非常合理的建议,您对过早优化是绝对正确的。我在一次面试中被问到这个问题,面试官坚持认为他们是解决这个问题的更好方法。只是想找出它是什么......(我忘了在采访结束时问他)
    • 如果您在原始问题中包含所有相关信息会很有帮助。我已经编辑了我的答案以提供一种替代解决方案。
    猜你喜欢
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 2021-02-13
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多