1. 字符串匹配问题概述
字符串匹配是计算机科学中最基础也最常遇到的问题之一。给定一个主字符串(haystack)和一个模式字符串(needle),我们需要在主字符串中找出模式字符串首次出现的位置。这个问题看似简单,但在实际应用中却有着广泛的需求——从文本编辑器中的查找功能到病毒扫描引擎的模式识别,再到DNA序列比对,都离不开高效的字符串匹配算法。
力扣第28题"找出字符串中第一个匹配项的下标"正是对这一经典问题的直接呈现。题目要求我们实现一个函数,返回needle在haystack中第一次出现的位置索引,如果不存在则返回-1。表面上看,这似乎只需要一个简单的循环就能解决,但不同的实现方式在性能上可能有天壤之别。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力匹配法:最直观的解决方案
2.1 暴力匹配的实现思路
暴力匹配(Brute-Force)是最容易想到的解决方案。其核心思想是:从主字符串的第一个字符开始,逐个与模式字符串的字符进行比较。如果全部匹配成功,则返回当前起始位置;如果中途发现不匹配,则将模式字符串向右移动一位,重新开始比较。
java复制public int strStr(String haystack, String needle) {
int n = haystack.length(), m = needle.length();
for (int i = 0; i <= n - m; i++) {
int j;
for (j = 0; j < m; j++) {
if (haystack.charAt(i + j) != needle.charAt(j)) {
break;
}
}
if (j == m) {
return i;
}
}
return -1;
}
2.2 暴力匹配的性能分析
暴力匹配的时间复杂度在最坏情况下为O((n-m+1)*m),其中n是主字符串长度,m是模式字符串长度。当主字符串为"aaaaa...aaaab",模式字符串为"aaab"时,算法性能会急剧下降。
提示:虽然暴力匹配在最坏情
