本文共 933 字,大约阅读时间需要 3 分钟。
在编程的过程中,常需要实现某一特定功能的高效算法。本文将详细解析如何在字符串 haystack 中查找第一位出现子字符串 needle 的方式,并提供相应的代码实现。
代码简要说明:
结构初始化
首先,我们需要获取 haystack 和 needle 的长度。int l1 = haystack.length(), l2 = needle.length();
接下来,进行基本的参数校验。如果 needle 的长度大于 haystack,则直接返回-1。
if (l2 > l1) return -1;
另外,如果 needle 为空字符串,按题意应该返回0。
if (needle.empty()) return 0;
滑动窗口遍历
采用滑动窗口的方式遍历 haystack。窗口的大小等于 needle 的长度,遍历次数则为 haystack.length() - hay.getWindowSize() + 1。for (int i = 0; i <= l1 - l2; i++)
字符匹配
在每一次遍历中,逐个字符比较 haystack窗口内的字符与 needle 中的对应字符。注意,这种方法可能会重复进行同一字符的比较,因此需要引入计数器来记录匹配的进度。int cnt = 0;for (int j = 0; j < l2; j++)
只要发现一个字符不匹配,就立即终止当前的匹配过程,并继续下一个窗口的检查。只有所有字符都匹配时,才满足条件。
if (haystack[i + j] != needle[j]) break;else cnt++;
返回结果
如果在某次循环中匹配成功,则返回当前窗口的起始索引i。if (cnt == l2) return i;
无匹配返回
如果遍历完所有可能的窗口都没有找到匹配的子字符串,则返回-1。return -1;
让我们以示例1进行分析:
这种方法能够正确找到第二个字符位置开始的"ll"。通过上述算法,i=0时,检查第0和第1个字符是否与
转载地址:http://jkryk.baihongyu.com/