Python实现不限字符间隔的顺序子串匹配代码问题排查
代码逻辑问题排查
你的代码存在3个核心错误,直接导致无法实现预期的子序列匹配效果:
- 变量名覆盖问题:函数入参
x原本存储用户输入的完整字符串,但循环内执行x = string[i]后,x被覆盖为模式串的单个字符,原始输入串直接丢失,后续所有索引查找操作的操作对象完全错误。 - 匹配逻辑不符合规则:子序列匹配要求「后一个匹配字符必须出现在前一个匹配字符的位置之后」,但原代码每次都在全字符串范围查找字符的全局首次/末次出现位置,完全没有记录前一个字符的匹配位置,不仅会出现顺序判断错误,也无法识别重复字符(比如模式串
hello里的两个l)的匹配要求。 - 方法认知错误:Python字符串的
index()/rindex()方法在找不到目标字符时会直接抛出ValueError异常,不会返回-1,原代码写的last == -1 or first == -1的异常分支永远不会触发,只要输入串缺失模式串的任意字符,程序会直接崩溃而非返回False。
修正后代码
采用指针记录匹配进度的逻辑实现,逻辑简单适合初学者理解,时间复杂度为O(n):
def checkPattern(input_str, pattern): # 输入串长度小于模式串,直接判定不匹配 if len(input_str) < len(pattern): return False # 指针记录当前需要匹配的模式串字符位置 match_pos = 0 pattern_len = len(pattern) for c in input_str: if c == pattern[match_pos]: match_pos += 1 # 所有模式字符匹配完成,直接返回成功 if match_pos == pattern_len: return True # 遍历完输入串仍未匹配完所有模式字符 return match_pos == pattern_len if __name__ == "__main__": input_content = input() target = "hello" print("YES" if checkPattern(input_content, target) else "NO")
效果验证
- 输入
h.e.l.l.o:按顺序匹配到h、e、l、l、o,输出YES - 输入
hlelo:匹配到h、e后,后续仅能匹配到1个l,无法凑齐两个l,输出NO - 输入
ehllo:首个匹配到的字符是e,h出现在e之后,无法按顺序凑齐h开头的序列,输出NO - 输入
aaahhheeelllooo:按顺序匹配到所有目标字符,输出YES
内容的提问来源于stack exchange,提问作者user19375323
相关产品推荐
相关产品推荐

