*串的基本操作*

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


//静态:
void conat(char t[], char s1[], char s2[])//字符串连接, t串为由 s2 串联接到 s1 串构成的新串
{
    int j=0, k=0;
    while(s1[j]!='\0')
        t[k++]=s1[j++];
    j=0;
    while(s2[j]!='\0')
        t[k++]=s2[j++];
    t[k]='\0';
}

bool substring(char sub[], char s[], int pos, int len)//求子串
{
    if(pos<1) return -1;
    int i;
    while(i<pos-1&&s[i]!='\0')//将i定位到子串的开始位置
        i++;
    if(i<pos-1||s[i]=='\0')//pos的位置不合法
        return -1;
    else
    {
        int k=0;
        while(k<len&&s[i]!='\0')
            sub[k++] = s[i++];
        if(k<len)//循环中止,即未达到子串要求的长度(length(s)-pos+1<len)
            return -1;
        else
        {
            sub[k]='\0';
            return 1;
        }
    }
}


int index(char s[], char t[], int pos)// T为非空串。若主串S中第 pos 个字符之后存在与t相等的子串,
// 则返回第一个这样的子串在S中的 位置,否则返回0
{
    if(pos>0)
    {
        int i=pos-1;
        int j=0;
        while(s[i+j]!='\0'&&t[j]!='\0')
        {
            if(s[i+j]==t[j])
                j++;        //继续比较后继字符
            else
            {
                i++;
                j=0;
            }//i后移,重新开始新一轮比较
        }
        if(t[j]=='\0') //匹配成功
            return (i+1);
        else           //不存在和串t相同的子串
            return -1;
    }
    return -1; // 位置不合法,s中不存在与t相等的子串

}

//动态

typedef int status;
typedef struct
{
    char *ch; //若是非空串,按串长分配存储区, 否则ch为NULL
    int   length; //串长度
}String;
status initstring(String &s)//初始化一个串
{
     s.ch = (char *)malloc(sizeof(char));
     if(!s.ch) exit(0);
     s.ch=NULL;
     s.length = 0;
     return 1;
}
status strassign(String &t, char *str)//为串t赋值
{
    if(t.ch)
        free(t.ch); //释放t原有空间
    int i=0;
    while(str[i]!='\0') //求str长度i
        i++;
    if(!i)
    {
        t.ch = NULL;
        t.length = 0;
    }
    else
    {
        t.ch = (char *) malloc ((i+1) * sizeof(char));
        if(!t.ch) exit(0);
        int j=0;
        for(j=0; j<i; j++)
            t.ch[j]=str[j];
        t.length = i;
    }
    return 1;
}

int strlength(String &s)
{
    return s.length;
}

status strcompare(String s, String t)
{
    int i=0;
    for(i=0; i<s.length&&i<t.length; i++)
        if(s.ch[i]!=t.ch[i])
            return s.ch[i] - t.ch[i];
    return s.length-t.length;//相等的情况
}

status clearstring(String &s)
{
    if(s.ch)
    {
        free(s.ch);
        s.ch = NULL;
    }
    s.length = 0;
    return 1;
}

status concat(String &t, String s1, String s2)
{
    int i, j;
    if(t.ch)
        free(t.ch);
    t.ch = (char *) malloc ((s1.length+s2.length+1) * sizeof(char));
    if(!t.ch) exit(0);
    for(i=0; i<s1.length; i++)
        t.ch[i] = s1.ch[i];
    t.length=s1.length+s2.length;
    for(i=0; i<s2.length; i++)
        t.ch[s1.length+i]=s2.ch[i];
    return 1;
}

status substring(String &sub, String s, int pos, int len)//用sub返回串s第pos个字符起长度为len的子串
{
    if(pos<1||pos>s.length||len<0||len>s.length-pos+1)
        return -1;
    if(sub.ch)
        free(sub.ch);
    if(!len)
    {
        sub.ch = NULL;
        sub.length = 0;
    }//空子串
    else
    {
        sub.ch = (char *) malloc (len * sizeof(char));
        int i;
        for(i=pos-1; i<pos+len-1; i++)
            sub.ch[i-pos+1]=s.ch[i];
        sub.length = len;
    }//完整子串
    return 1;
}

bool StrInsert (String &s,  int pos,  String &t)// 在串 S 的第 pos(1≤pos≤StrLength(S)+1) 个字符之前插入串T
{

    int slen=strlength(s);
    int tlen=strlength(t);
    // 求串长
    String s1;
    s1.ch = (char *) malloc ((slen + 1) * sizeof(char));           // 设S1为辅助串空间
    if (pos < 1 || pos > slen+1)// 插入位置不合法;
        return -1;
    if (tlen>0)
    {
        int i=0, k=0;
        for(i=0; i<slen; i++)
            s1.ch[i] = s.ch[i];      // 暂存串S
        free(s.ch);
        s.ch = (char *) malloc ((slen + tlen + 1) * sizeof(char));   // 重新分配空间
        for ( i=0, k=0; i<pos-1; i++)
            s.ch[k++] = s1.ch[i];   // 保留插入位置之前的子串
        int j = 0;
        for(j=0; j<tlen; j++)
            s.ch[k++] = s.ch[j++];      // 插入t
        for(i=0; i<slen; i++)
            s.ch[k++] = s1.ch[i++];   // 复制插入位置之后的子串
        s.ch[k] ='\0';                       // 置串S的结束标志

    }
}

void printf(String s)
{
    int i;
    for(i=0; i<s.length; i++)
        printf("%c", s.ch[i]);
    printf("\n");
}


<pre name="code" class="cpp">int index(String &s, String &t, int pos)// t为非空串。若主串s中第 pos 个字符之后存在与t相等的子串,
// 则返回第一个这样的子串在S中的 位置,否则返回0
{
    if(pos>0)
    {
        int i=pos-1;
        int j=0;
        int tlen = strlength(t);
        int slen = strlength(s);
        for(j=0; j<tlen; j++)
        {
            if(s.ch[i+j]!=t.ch[j])
            {
                i++;
                j=-1;
            }//i后移,重新开始新一轮比较
            if(i+j>=slen)
            {
                break;
            
            }   
        }    
        if(j==tlen) //匹配成功
             return (i+1);
        else           //不存在和串t相同的子串
              return -1;
    }
        return -1; // 位置不合法,s中不存在与t相等的子串


 
 

 kmp算法实现字符串匹配

int next[n];
void getnext(str &s2)
{
    int i=0;
    next[0]=-1;
    int j=-1;
    while(i<s2.len)//自己跟自己匹配
    {
        if(j==-1||s2.ch[i]==s2.ch[j])
        {
            i++;
            j++;
            next[i]=j;  
        }
        else
            j=next[j];
    }
}

int index_kmp(str &s1, str &s2)
{
    getnext(s2);
    int i=0, j=0;
    while(i<s1.len&&j<s2.len)
    {
        if(j==-1||s1.ch[i]==s2.ch[j])//next[0]=-1||不失配
        {
            i++;
            j++;
        }    //继续比较后序字符
        else //若从除0之外的位置失配,s1的i指针不回溯, 从s2的k位置开始匹配
            j=next[j];
    }
    if(j>=s2.len) return i-s2.len+1;//子串结束, 说明匹配成功
    else
        return -1;
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值