判断一个字符串中是否包含另一个字符串(KMP、BF)

判断一个字符串是否是另一个字符串的子串,也就是strstr()函数的实现,简单的实现方法是BF算法。

1.BF算法

int BF(char *s, char *p){
    if(s==NULL || p==NULL)return -1;
    int i=0;
    int j;
    while(i<strlen(s)){
        j=0;
        while(s[i]==p[j] && j<strlen(p)){
            i++;
            j++;
        }
        if(j==strlen(p))return i-j;
        i=i-j+1;
    }
    return -1;
}

2.KMP算法

KMP算法的原理有很多文章解释,这就不说了(我也看得不是很懂......)。整个KMP算法的关键点在于next数组的实现。

KMP算法主体:

int KMP(char *s, char *p){
    if(s==NULL || p==NULL)return -1;
    int next[100];
    get_next(next, p);
    int i=0;
    int j=0;
    while(i<strlen(s)){
        if(j==-1 || s[i]==p[j]){
            i++;
            j++;
        }else{
            j=next[j];
        }
        if(j==strlen(p))return i-j;
    }
    return -1;
}

get_next函数的实现:

void get_next(int *next, char *p){
    if(next==NULL || p=NULL)return;
    int i=0;
    int j=-1;
    next[0]=-1;
    while(i<strlen(p)-1){
        if(j==-1 || p[i]==p[j]){
            i++;
            j++;
            next[i]=j;
        }elseP{
            j=next[j];
        }
    }
}

注意,get_next函数的实现只与子字符串有关系...

时间: 2024-10-24 23:30:24

判断一个字符串中是否包含另一个字符串(KMP、BF)的相关文章

C#判断字符串中是否包含一个子字符串是可以直接使用Contains()方法

1. 以前判断一个字符串中是否包含另一个子字符串时,习惯使用 IndexOf(); string str = "[email protected]"; if(str.IndexOf("@")>=0){ //any other code } 2. 后来发现,原来C#中还定义了Contains()这样的方法,使用如下: String abc = "[email protected]@"; bool result = abc.Contains(&

js判断一个dom中是否包含另一个dom的方法

首先,比较原始(蠢)的方法 function isChildOf(child, parent) { if(child && parent) { let parentNode = child.parentNode; while(parentNode) { if(parent === parentNode) { return true; } parentNode = parentNode.parentNode; } } return false; } 这里 while 中判断其实在实际情况我们

oracle判断一个字符串中是否包含另外一个字符串

select * from a where instr(a,b)>0; 用于实现B字段是A字段中的某一部分的时候,要论顺序或者要相邻的字符. 如果想要不论顺序或者不相邻的字符时,定义函数可以实现: select * from a where instr(a,b)>0; 这个只能实现B字段是A字段中的某一部分的时候. 如果想要不论顺序或者不相邻的字符时,定义函数可以实现 create or replace function checks(v_a varchar2,v_b varchar) ret

用JAVA写查询一个字符串中是否包含另外一个字符串以及出现的次数

package JAVA; import java.awt.List;import java.util.ArrayList;/** *  * @author 梁小鱼 * */public class MyTest { public static void main(String[] args) {  //查找字符串在目标字符串是否存在  Boolean isExit = IsExit("f","abfsdfsdkjl;fas;dlfsldf;asdfsdfaszdf"

Excel-判断一个文本字符串中是否包含数字! 判断一个文本字符串是否是纯汉字!

0.判断一个文本字符串中是否包含数字!/判断一个文本字符串是否是纯汉字! 公式=IF(LENB(A1)=2*LEN(A1),”都是汉字“,“含有非汉字字符”) 解释函数: LEN(A1)#返回文本字符串中的字符个数:  ##双字字符*1*双字节字符个数+单字节字符*1*单字节字符个<=>计算字符个数: LENB(A1)#返回文本字符串中的字符个数.与双字节字符集(DBCS)一起使用.##双字节字符*2*双字节字符个数+单字节字符*1*单字节字符个数<=>计算字节个数: 字符:分为双

java循环练习:输入一个字符串,统计该字符串中分别包含多少个数字,多少个字母,多少个其他字符

package practiceGO; import java.util.Scanner; /*  * 3.输入一个字符串,统计该字符串中分别包含多少个数字,多少个字母,多少个其他字符  */ public class Cto { public static void main(String[] args) {         int englishCount = 0;// 英文字母个数         int spaceCount = 0;// 空格个数         int numCoun

判断一个数字中是否包含两个相同的子串并输出

功能:判断一个数字中是否包含两个相同的子串(字串长度至少大于等于2),并输出(仅输出第一次相同的子串) 1 package ren.laughing.test.problem; 2 3 import java.util.Scanner; 4 5 /** 6 * 功能:判断一个数字中是否包含两个相同的子串(字串长度至少大于等于2),并输出(仅输出第一次相同的子串) 7 * 8 * @author Laughing_Lz 9 * @time 2016年7月4日 10 */ 11 public cla

c#生成一个某文本中不包含的随机字符串

//生成一个某文本中不包含的随机字符串 private static string GetRandomStr(string allStr) { int number; string resStr; do { resStr = string.Empty; Random random = new Random(); for (int i = 0; i < 9; i++) { number = random.Next(); number %= 36; if (number < 10) { numbe

用php的strpos() 函数判断字符串中是否包含某字符串的方法

PHP strpos() 函数 strpos() 函数返回字符串在另一个字符串中第一次出现的位置. 如果没有找到该字符串,则返回 false.语法 strpos(string,find,start) 参数 描述string 必需.规定被搜索的字符串.find 必需.规定要查找的字符.start 可选.规定开始搜索的位置. 注释:该函数对大小写敏感.如需进行对大小写不敏感的搜索,请使用 stripos()函数.编辑本段例子 <?php echo strpos(www.idc-gz.com,"