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
对于字符串的操作 ,常见的有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
相关文章推荐
- C/C++,Windows/MFC, char, wchar_t, TCHAR 字符全总结 & c++字符串操作经验集
- char, wchar_t, TCHAR 字符全总结 & c++字符串操作经验集
- C/C++语言字符串操作总结大全(超详细)
- C/C++语言字符串操作总结
- char, wchar_t, TCHAR 字符全总结 & c++字符串操作经验集
- JAVA与C++::关于JNI中文字符串操作问题总结
- char, wchar_t, TCHAR 字符全总结 & c++字符串操作经验集
- C/C++语言字符串操作总结大全(超详细)
- c++字符及字符串操作总结
- C/C++语言字符串操作总结大全(超详细)
- C/C++语言字符串操作总结
- C++ 字符串string类型最常用操作总结
- C++和C对字符串操作总结
- c++重点字符串操作函数一览,个人总结
- C/C++语言字符串操作总结大全(超详细)
- C/C++语言字符串操作总结大全(超详细)
- C++字符串操作总结
- JAVA与C++::关于JNI中文字符串操作问题总结
- C/C++字符串操作函数总结
- C/C++语言字符串操作总结大全(超详细)