寻找字符字串的两个方法
来源:互联网 发布:淘宝智能版怎么装修 编辑:程序博客网 时间:2024/06/05 17:55
寻找字符子串的两个方法
提供两个字符串 A 和 B,求 B 在 A 中出现的次数和位置。
直接暴力匹配时间复杂度太高,效率太低,时间一定会超时。
两个方法
KMP 算法,时间复杂度O(m + n);
源码:
//优化过后的next数组求法,核心部分void GetNextval(char* p, int next[]) { int pLen = strlen(p); next[0] = -1; int k = -1; int j = 0; while (j < pLen - 1) { //p[k]表示前缀,p[j]表示后缀 if (k == -1 || p[j] == p[k]) { ++j; ++k; //较之前next数组求法,改动在下面4行 if (p[j] != p[k]) next[j] = k; //之前只有这一行 else //因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]] next[j] = next[k]; } else { k = next[k]; } } } //KMP 算法int KmpSearch(char* s, char* p) { int i = 0; int j = 0; int sLen = strlen(s); int pLen = strlen(p); while (i < sLen && j < pLen) { //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++ if (j == -1 || s[i] == p[j]) { i++; j++; } else { //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j] //next[j]即为j所对应的next值 j = next[j]; } } if (j == pLen) return i - j; else return -1; }
哈希算法,时间复杂度度O(m+n)
源码
#define rint register int #define ULL unsigned long longconst ULL seed = 131;inline int strlen(const char* src){ rint len = 0; while(src[len]) len++; return len;}RESULT search(const char* src, const char* substr){ RESULT res; res.count = 0; int srcLen = strlen(src); int subLen = strlen(substr); ULL sum = 1; for(rint i = 0; i < subLen; i++) { sum *= seed; } ULL strHash = 0; ULL subHash = 0; //核心部分 for(rint i = 0; i < subLen; i++) { strHash = strHash * seed + src[i]; subHash = subHash * seed + substr[i]; } for(rint i = 0; i + subLen < srcLen; i++) { if(strHash == subHash) { res.indexes[res.count++] = i; } if(i + subLen < srcLen) strHash = strHash * seed + src[i + subLen] - src[i] * sum; } return res;}
哈希函数原型:
unsigned int BkdrHash(const char* str, unsigned int len){ unsigned int seed = 131; /*31 131 1313 13131 131313 etc*/ unsigned int hash = 0; for(int i = 0; i < len; ++i){ hash = (hash * seed) + (*str++); } return hash;}
阅读全文
0 0
- 寻找字符字串的两个方法
- 在一个字符串中,寻找含有目标字符的最短的字串
- [经典面试题][搜狗]在一个字符串中寻找包含全部出现字符的最小字串
- 计算两个字符串的最大公共字串的长度,字符不区分大小写(要求计算连续最长字串的长度)
- 字符数组中寻找宽字符的方法
- 比较两个字串的函数
- 题目标题: 计算两个字符串的最大公共字串的长度,字符不区分大小写
- 华为机试:计算两个字符串的最大公共字串的长度,字符不区分大小写
- Java 拼接字符的两个方法
- 求两个字符串的最大公共字串
- 求两个字符串的最大公共字串
- 两个字符串中最大的公共字串
- 获取两个字符串包含最大的字串
- 两个自然数的寻找过程
- 寻找和的两个加数
- 寻找两个数组的中位数
- 在字符串中寻找连续最长的数字串
- 删除字串中指定的字符
- BigNums——HDUOJ 1063
- 【单词倒置】附一个考试易错点
- c primer plus 第十章学习梳理小结
- Algorithm8——图论总结
- PyQt5学习笔记13----pyqt线程间通信
- 寻找字符字串的两个方法
- CentOS7启动、停止MySQL
- Atom本地安装插件右上角会有红色报错,大概是 cannot find module ‘lodash.random’ 之类的,缺少关键项。
- Linux内核中工作队列的使用work_struct,delayed_work
- oracle用户管理
- Windows系统下pip安装Python库出错的解决方案
- 数字整除
- C语言、C++矩阵乘法优化
- 解决MySQL拒绝远程连接的问题