问题描述
给定两个字符串 haystack
和 needle
,我们需要在 haystack
中找出 needle
字符串的第一个匹配项的下标。如果 needle
不是 haystack
的一部分,则返回 -1。
暴力搜索算法
暴力搜索算法是一种简单直观的字符串匹配方法。它的基本思想是:从 haystack
的每个可能的起始位置开始,检查是否有与 needle
相匹配的子串。
算法步骤
- 检查空字符串:如果
needle
是空字符串,根据题意返回 0。 - 获取长度:获取
needle
和haystack
的长度。 - 遍历
haystack
:遍历haystack
,对于每个可能的起始位置,使用内层循环检查needle
是否匹配。 - 字符比较:在内层循环中,比较
haystack
的子串和needle
的每个字符。 - 返回结果:如果找到匹配项,返回匹配项的下标;如果遍历完
haystack
都没有找到匹配项,返回 -1。
Java 实现
以下是使用暴力搜索算法解决字符串匹配问题的 Java 实现:
java
class Solution {public int strStr(String haystack, String needle) {// 如果needle为空字符串,根据题意返回0if (needle.isEmpty()) return 0;// 获取needle和haystack的长度int m = needle.length();int n = haystack.length();// 遍历haystackfor (int i = 0; i <= n - m; i++) {// 从当前位置开始比较needle和haystack的子串是否相等for (int j = 0; j < m; j++) {// 如果不相等,跳出内层循环,继续外层循环if (haystack.charAt(i + j) != needle.charAt(j)) {break;}// 如果相等,继续比较下一个字符if (j == m - 1) {return i; // 如果比较完needle的最后一个字符,说明找到了匹配项,返回下标}}}// 如果遍历完haystack都没有找到匹配项,返回-1return -1;}
}
代码解释
- 处理特殊情况:如果
needle
是空字符串,根据题意返回 0。 - 获取长度:获取
needle
和haystack
的长度。 - 遍历
haystack
:使用外层循环遍历haystack
,内层循环遍历needle
。 - 字符比较:在内层循环中,比较
haystack
的当前子串和needle
的每个字符。 - 返回结果:如果找到匹配项,返回匹配项的下标;如果遍历完
haystack
都没有找到匹配项,返回 -1。