c/c++字符串操作 总结

对于搞c/c++的人来说,不管是工作还是面试总是要遇到字符串的问题,

对于字符串的操作 ,常见的有3种,

(1) A串是不是B串的子串 ,<算法 KMP>,数据结构里有详细的说明;

主要代码:

void getnext(char *t,int * next)   
{
int i=1,j=0;
 next[0]=next[1]=0;
 while (i<(int)strlen(t))
 {
  if (j==0||t[i]==t[j])
  {
   i++;
   j++;
   next[i]=j; 
  }
  else j=next[j];
 } 
}


int indexKMP(char *s,char *t,int pos,int *next)
{
 if(s!=NULL || t!=NULL)
  return -1;  //printf("fail");
 int i=pos;
 int j=1;
 int len_s=strlen(s);
 int len_t=strlen(t);
 while(i<=(len_s-len_t) && j<=len_t)
 {
  if(j==0 || s[i]==t[j])
  {
   i++;
   j++;
   
  }else
   j=next[j];
 }
 if(j>len_t)
  return (i-j+1);
 else
  return -1;
}

 

(2)在字符串里查找最长重复子串 ,<算法 后缀数组>;

主要代码:

int cmp(const void *a,const void *b)
{
 return strcmp(*(char**)a,*(char**)b);
}

int comlen(const char *p,const char *q)
{
 int i=0;
 if(p==NULL || q==NULL) return 0;
 while(*p && (*p++==*q++))i++;
 return i;
}

 

void dealstring(char *p ,char **str )
{
 int len=strlen(p);
 for(int i=0;i<len;i++)
  str[i]=&p[i];
}


int FindSubString( char **str, int len,int &outputpos)
{
  qsort(str,len,sizeof(str[0]),cmp);//很重要,对字符串进行排序;
  int h=0;
  int maxlen=0;
  for(int i=0;i<len-1;i++)
  {
   if((h=comlen(str[i],str[i+1]))>maxlen)  
   {
    maxlen=h;
    outputpos=i;
   }
  }
 return maxlen; 
 
}

 

(3) 求A串与B串的最长公共公共子串,  <算法 LCS>,

用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置。

主要代码:

void lcs(int xLen, int yLen, char x[], char y[], int **c)

{

 int i,j;

for(i=0;i<xLen;i++)
   for(j=0;j<yLen;j++)
    c[i][j]=0;       //初始化;
 for(i=1;i<=xLen;i++) 
  for(j=1;j<=yLen;j++)
   if(x[i-1]==y[j-1])
    c[i][j]=c[i-1][j-1]+1;

}

 

 

//最后,有什么问题或建议可以直接留言;QQ:79790339

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值