1. 问题背景与需求分析
字符串匹配是计算机科学中最基础也最常遇到的问题之一。力扣第28题"找出字符串中第一个匹配项的下标"正是这一经典问题的具体体现。在实际开发中,从文本编辑器的搜索功能到病毒扫描引擎的模式识别,都离不开高效的字符串匹配算法。
这道题的要求很明确:给定一个主字符串haystack和一个子字符串needle,我们需要在haystack中找到第一个与needle完全匹配的子串,并返回其起始下标。如果不存在这样的子串,则返回-1。看似简单的问题背后,却隐藏着从O(n*m)到O(n+m)的时间复杂度优化空间。
需要模型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++) {
boolean matched = true;
for (int j = 0; j < m; j++) {
if (haystack.charAt(i + j) != needle.charAt(j)) {
matched = false;
break;
}
}
if (matched) return i;
}
return -1;
}
这个实现的时间复杂度是O((n-m)m),当n远大于m时接近O(nm)。虽然简单,但在处理长字符串时效率明显不足。
2.2 暴力法的优化技巧
在实际编码中,我们可以对暴力法进行几项优化:
- 提前检查needle是否为空字符串
- 主循环只需遍历到n-m位置
- 发现不匹配立即跳出内层循环
- 使用String的substring方法简化比较
优化后的版本:
java复制public int strStr(String haystack, String need
