您的位置:首页 > 编程语言 > C语言/C++

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

2009-03-03 20:09 375 查看
对于搞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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: