博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构---字符串
阅读量:3947 次
发布时间:2019-05-24

本文共 886 字,大约阅读时间需要 2 分钟。

字符串是由0个或多个字符构成的序列,可记为s='a1a2a3…an',其中ai可以是字母,也可是数字或者其他字符,零个字符的串称为空串。

而字符串的顺序结构就是用简单的char类型数组来存储没什么好说的,下面介绍一下BF算法与KMP算法:

BF算法就是比较平常的双重循环,如果匹配成功打断循环,否则子串的比较开始数加一,函数:

int BF(char s[],char t[])

{
int start=0;
int i=0,j=0;
while((s[i]!='\0')&&(t[j]!='\0'))
{
    if(s[i]==t[j]) {i++;j++;}
    else {start++;i=start;j=0;}
}
if(t[j]=='\0') return start+1;
else return 0;
}

相比较于BF算法,KMP算法减少了回溯的过程,这样大大提高了代码效率,它的思想就是找到副串当中,当前位置的字符与要匹配的串前面有多少相同的字符,这样就可以直接和相同之后的字符匹配,大大减少了时间复杂度。

借张图表示一下每个表示有多少相同字符的数组计算方法:

具体实现代码:

void Next(char *t,int *nv,int size)        

{
    int i=1,j=0;
    nv[1]=0;
    while(i<size)
    {
        if(j==0||t[i]==t[j])                 
        {
            ++i;++j;
            nv[i]=j;                       
        }
        else
            j=nv[j];           
}
}
int KMP(char *s,char *t,int pos,int size1,int size2)  
{
    int i=pos,j=1;
    int *next=new int[size2];
    next[0]=size2;
    Next(t,next,size2);                        
    while(i<size1&&j<size2)                           
    {
        if(j==0||s[i]==t[j])
        {i++;j++;}
        else
        j=next[j];
    }
    if(j>=size2)
        return i-size2+1;                      
    else
        return 0;                              
}
 

你可能感兴趣的文章
如何在JNI中抛异常
查看>>
Android应用程序的完全退出
查看>>
Task和Activity相关的一些属性
查看>>
JAVA系统属性之user.home
查看>>
Android代码截屏
查看>>
Android中打印代码的调用层次
查看>>
成功者十三个价值连城的习惯
查看>>
特别成功的人会做6件事
查看>>
Android: 用jni 获取MAC地址
查看>>
字符串列表的C语言实现:c_strlist
查看>>
客户沟通的方式:礼貌待客沟通方式,技巧推广沟通方式,个性服务沟通方式
查看>>
用弹性工作制留住员工
查看>>
知识=经验×反思2
查看>>
领导者如何发现关键问题
查看>>
学习无为领导力
查看>>
卓越领导看过程
查看>>
领导力与各种循环挑战
查看>>
达成谈判协议 - 避免操之过急
查看>>
销售人说话“十大忌”
查看>>
营销中的“战略非对称”
查看>>