当前位置: 首页 > news >正文

广饶网站建设晋中网络推广

广饶网站建设,晋中网络推广,西青集团网站建设,网站开发实训设计报告题目 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1: 输入:haystack …

题目

给你两个字符串 haystack 和 needle ,请你在 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 <= 104
  • haystack 和 needle 仅由小写英文字符组成

解题思路

暴力解法

  • 处理边界条件:len_h 和 len_n比较
  • 遍历数组haystack,一旦其中有字符和needle首字符相匹配,进入匹配判断
  • 判断匹配直接返回下标,若不匹配继续遍历数组haystack,直到结束

暴力解法时间复杂度 O(m * n)

代码

int strStr(char* haystack, char* needle) {int len_h = strlen(haystack);int len_n = strlen(needle);if (len_n == 0) return 0;  // 如果needle是空字符串,按照题意应返回0if (len_h < len_n) return -1;// 注意这里循环条件改为 <= for (int head = 0; head <= (len_h - len_n); head++) {if (haystack[head] == needle[0]) {int i;// 尝试匹配整个needlefor (i = 0; i < len_n; i++) {if (haystack[head + i] != needle[i]) {break;  // 不匹配,跳出内层循环}}// 如果i等于len_n,说明完全匹配if (i == len_n) {return head;}}}return -1;  // 未找到匹配
}

改进代码

KMP算法

KMP算法核心思想

部分匹配表(Next数组):预处理模式串,构建一个数组记录当匹配失败时,模式串应该回退到的位置。
避免回溯:利用已知信息,当匹配失败时,不必将模式串回退到起点,而是根据部分匹配表回退到合适位置。

详细工作原理

构建Next数组:

  • Next[i]表示当第i个字符匹配失败时,模式串应该回退到的位置
  • 它实际上记录了模式串中前缀和后缀的最长公共元素长度

匹配过程:

  • 主串索引i不回退,只前进
  • 当匹配失败时,根据Next数组调整模式串索引j的位置
  • 这样避免了重复比较已知不会匹配的部分
// 构建Next数组
void buildNext(char* pattern, int* next, int len) {// 初始化int j = 0;next[j] = 0;/* j:指向前缀末尾位置,同时j也表示i之前的子串的最长相等前后缀的长度i:指向后缀末尾位置*/for(int i = 1; i < len; i++){// 处理不相等的情况 -> 让j进行回退while(j > 0 && pattern[j] != pattern[i]){j = next[j - 1];}/*回退结束有两种情况:1.找到最长相等前后缀的位置了。2.没有相等的前后缀,此时j=0*/if(pattern[j] == pattern[i])    {j++;}next[i] = j;}
}// KMP匹配函数
int strStr(char* haystack, char* needle) {if (!needle[0]) return 0;  // 空模式串匹配任何位置int len_h = strlen(haystack);int len_n = strlen(needle);if (len_h < len_n) return -1;// 创建并初始化Next数组int* next = (int*)malloc(sizeof(int) * len_n);buildNext(needle, next, len_n);// 进行匹配int i = 0;  // 主串索引int j = 0;  // 模式串索引while (i < len_h && j < len_n) {if (haystack[i] == needle[j]) {i++;j++;} else if (j > 0) {j = next[j-1];  // 根据Next数组调整模式串索引} else {i++;}}free(next);  // 释放内存// 如果j等于len_n,说明找到完全匹配if (j == len_n) {return i - j;}return -1;  // 未找到匹配
}
http://www.dtcms.com/a/559791.html

相关文章:

  • 湛江制作网站公司PHP调用wordpress数据库ID
  • 唐山如何做百度的网站天猫设计师服务平台
  • 怀远做网站电话做网站你给推广
  • 清河网站建设多少钱广东建设工程信息网官网证书查询
  • seo的优点seo招聘的关键词
  • 学历教育网站建设客户端
  • 网站开发技术项目it外包风险
  • 最强的管理咨询公司东莞网站seo优化托管
  • 怎么建设两个大淘客网站网站设计鉴赏
  • x网站免费咨询网络服务商怎么弄
  • 无锡建设建设局网站wordpress文章和页面
  • python做的网站哪些株洲公司做网站
  • 网页网站免费哪个网站推广产品好
  • 营销型平台网站建设wordpress子主题制作
  • 做如美团式网站要多少钱聊城网站建设电话
  • 比较有名的个人网站抖音代运营服务商
  • 怎么做移动网站南京专业网站设计公司
  • 环艺做网站免费域名领取
  • 嘉兴服饰网站建设免费域名注册网站怎么登录
  • 手机网站微信登陆百度h5收费吗
  • 获取网站访客qq号电脑如何下载网页视频文件
  • 适合网站开发的框架微信公众号的模板网站
  • 上传的网站打不开 index.asp杭州正规的网站建设公司
  • 连云港专业网站优化多用户商城源码开发
  • 织梦网站上传步骤建站之星设计师
  • 在线简历免费制作网站建盏金盏能不能喝茶
  • 闲鱼网站建设ps网站建设
  • 网页制作什么主题好网站优化改版
  • 建设网站简单吗青海旅游网站建设方案
  • 山东省住房和城乡建设网站北京app制作公司