如何实现sequence_search方法?排查现有代码逻辑错误
你的序列搜索代码问题分析与修复方案
让我来帮你拆解代码里的问题,然后给出能正确运行的实现方案~
先说说你代码里的几个关键错误
错误1:字符匹配逻辑完全颠倒
你写的word[i].include?(key)是判断单个字符(比如"a")是否包含整个key字符串(比如"cat"),这永远会返回false——单个字符不可能装下更长的字符串。正确的逻辑应该是检查当前字符是否是key中还未匹配的第一个字符。错误2:数组追加元素的语法错误
Ruby里向数组添加元素用的是<<,而不是>>。>>是位运算的右移符号,用在这里会直接抛出异常,这就是你标注的那行代码报错的核心原因。错误3:整体匹配逻辑不符合需求
你的思路是收集word中所有属于key的字符,再判断是否等于key,但这无法保证字符的顺序连续性要求(比如sequence_search("coat", "cat"),你的逻辑根本收集不到正确的序列)。
正确的实现方案
我们可以用双指针法来实现,逻辑清晰且高效:
def sequence_search(word, key) key_index = 0 word.each_char do |char| # 匹配到key当前目标字符,就移动key的指针 if char == key[key_index] key_index += 1 # 一旦key的所有字符都按顺序匹配完成,直接返回true return true if key_index == key.length end end # 遍历完word仍未匹配完key的所有字符,返回false key_index == key.length end
代码逻辑解释
- 用
key_index跟踪我们当前需要匹配key中的第几个字符,初始值为0(对应key的第一个字符)。 - 遍历word的每个字符,如果当前字符和
key[key_index]相等,就把key_index加1——意味着我们完成了一个字符的匹配,接下来要找下一个。 - 当
key_index等于key的长度时,说明key的所有字符都按顺序在word中找到了,直接返回true。 - 遍历完整个word后,如果
key_index还没达到key的长度,说明没完全匹配,返回false。
测试用例验证
运行你给出的测试用例,结果完全符合预期:
sequence_search("arcata", "cat")→truesequence_search("c1a2t3", "cat")→truesequence_search("cta", "cat")→falsesequence_search("coat", "cat")→true
内容的提问来源于stack exchange,提问作者Sarbjot Singh
相关产品推荐
相关产品推荐

