一、strlen
方法一:计数器法
int my_strlen(const char*p)
{
assert(p);
int count = 0;
while (*p)
{
count++;
p++;
}
return count;
}
方法二:递归
int my_strlen(const char*p)
{
if(*p != '\0')
return my_strlen(p+1) + 1;
else
return 0;
}
方法三:指针减指针
int my_strlen(const char*p)
{
char* start = p;
char* end = p;
while(*end)
{
end++;
}
return end - start;
}
二、strcpy
char* my_strcpy(char* dest,const char* src)
{
assert(dest && src);//断言是否是空指针
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
三、strcmp (字符串比较)
int my_strcmp(const char*p1,const char*p2)
{
assert(p1 && p2);
while (*p1 == *p2)
{
if (*p1 == '\0')
return 0;
p1++;
p2++;
}
return *p1 - *p2;
}
四、strcat (字符串追加)
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
五、strstr(查找子串)
方法一:暴力求解
char* my_strstr(const char*dest,const char*src)
{
char* s1 = NULL;
char* s2 = NULL;
char* cp = dest;
while (*cp)
{
s1 = cp;
s2 = src;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cp;
cp++;
}
return NULL;
}
方法二:KMP算法
//KMP算法
//用空间换时间
//时间复杂度O(M+N),空间复杂度O(N)//M为字符串的长度,N为子串的长度
//算法核心:有一个数组next来记录字符串的最大前后缀重合的长度,next[i]就是记录前i个元素的最大前后缀重合的长度
//next[]就可以让指向子串的下标回溯的次数减少(不至于每次都从第一个元素枚举)
vector<int> KMP(char* s, char* text)
{
int n = strlen(s), m = strlen(text);
vector<int> next(m);
for (int i = 0, j = 1; j < m; j++)
{
while (i && text[i] != text[j])
i = next[i - 1];
if (text[i] == text[j])
i++;
next[j] = i;
}
vector<int> v;
for(int i = 0, j = 0; j < n; j++)
{
while (i && text[i] != s[j])
i = next[i - 1];
if (text[i] == s[j])
i++;
if (i == m)
{
v.push_back(j - m + 1);
i = next[i - 1];
}
}
return v;
}