深圳网站建设toolcat,如何加强网站信息管理建设,wordpress主题删不掉,怎么申请小程序题目描述
找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle #xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标#xff08;下标从 0 开始#xff09;。如果 needle 不是 haystack 的一部分#xff0c;则返回 -1 。
示例 1请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标下标从 0 开始。如果 needle 不是 haystack 的一部分则返回 -1 。
示例 1
输入haystack sadbutsad, needle sad
输出0
解释sad 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 所以返回 0 。示例 2
输入haystack leetcode, needle leeto
输出-1
解释leeto 没有在 leetcode 中出现所以返回 -1 。提示
1 haystack.length, needle.length 104haystack 和 needle 仅由小写英文字符组成
解法
暴力解法
暴力解法遍历haystack如果找到与needle第一个字母相同的再继续比较后面的字符
java代码
class Solution {public int strStr(String haystack, String needle) {// 遍历haystackfor (int i 0; i haystack.length(); i) {// 找到了与needle第一个字母相同的if (haystack.charAt(i) needle.charAt(0)) {// 如果needle长度为1直接返回if (needle.length() 1) {return i;}// 继续与needle后面的比较boolean isEqual true;for (int j 1; j needle.length(); j) {if (i j haystack.length() || haystack.charAt(i j) ! needle.charAt(j)) {isEqual false;break;}}if (isEqual) {return i;}}}return -1;}
}复杂度
时间复杂度O(n × m)其中 n 是字符串 haystack 的长度mmm 是字符串 needle 的长度空间复杂度O(1)
KMP算法
KMP算法比较复杂需要大量篇幅。推荐代码随想录的讲解简单透彻KMP算法
java代码
class Solution {/*** KMP解法** param haystack* param needle* return*/public int strStr(String haystack, String needle) {if(needle.length()0){return 0;}// 得到next数组int[] next new int[needle.length()];getNext(next, needle);int j -1;for(int i 0; ihaystack.length();i){// 如果遇到后缀不相等就回溯while(j0 haystack.charAt(i) ! needle.charAt(j1)){j next[j];}// 如果相等就把j向后移动if(haystack.charAt(i)needle.charAt(j1)){j;}// 模式字符串遍历完时全部匹配返回结果if(jneedle.length()-1){return (i-needle.length()1);}}return -1;}/*** KMP算法辅助函数找到前缀表的next数组* 思路这里使用前缀表统一减一的操作来找next数组* 定义两个指针i和jj指向前缀终止位置严格来说是终止位置减一的位置i指向后缀终止位置与j同理* 初始化int j -1; next[0] j;* 前后缀不相同处理如果 模式串 s 的s[i] 与 s[j1]不相同也就是遇到前后缀末尾不相同的情况就要向前回溯* 前后缀相同同时向后移动i 和j同时还要将j前缀的长度赋给next[i], 因为next[i]要记录相同前后缀的长度** param s* return*/private void getNext(int[] next, String s) {int j -1;next[0] j;for (int i 1; i s.length(); i) { // 注意i从1开始// 如果不相等要进行回溯注意要一直进行回溯所以用whilewhile (j 0 (s.charAt(i) ! s.charAt(j 1))) {// next[j]就是记录着j包括j之前的子串的相同前后缀的长度要找 j1前一个元素在next数组里的值就是next[j]j next[j];}if(s.charAt(i)s.charAt(j1)){j;}next[i] j;}}
}复杂度
时间复杂度O(nm)空间复杂度O(m)