算法学习(三)字符串查找,删除,复制strstr/strcpy/strpbrk等库函数

字符串的查找

题目描述:
给定一个字符串A,要求在A中查找一个子串B的位置
如A = “ABCDEF”,B = “CD”,返回3.从3开始。
相当于库函数strstr。
方法一:

#include<stdio.h>
#include<string.h>
//匹配函数
int match(char *str,char *sub)
{
    while(*sub != '\0')
    {
        while(*str++ != *sub++)
            return 0;

    }
    return 1;

}
int Strstr(char * str,char* substr)
{
    if(str == NULL || substr == NULL)
        return -1;
    if(strlen(str) < strlen(substr))
        return -1;
    int i = 0;
    while(*str != '\0')
    {
        if(match(str+i,substr))
        {
            return i+1;
        }
        i++;
    }
    return -1;
}
int main()
{
    char str[10] = "abcdef";
    char sub[5] = "bc";
    int cout;
    cout = Strstr(str,sub);
    if(-1 == cout)
        printf("not find\n");
    else
        printf("%d\n",cout);
    return 0;
}

代码中要注意一些边界值或者非法输入的处理,保证代码的高质量,可以从功能测试、边界测试、负面测试三方面设计测试用例,以确保代码的完整性。
也可以使用循环嵌套的方法。
方法二:

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

int strstr(char * str,char * sub)
{
    if(str == NULL || sub == NULL)
        return -1;
    int lenstr = strlen(str);
    int lensub = strlen(sub);
    if(lenstr < lensub)
        return -1;
    int i,j;
    int len = lenstr - lensub ;
    for(i = 0;i<=len;i++)
    {
        for(j = 0;j<lensub;j++)
        {
            if(str[i+j]!= sub [j] )
                break;
        }
        if (j == lensub)  //如果全部匹配说明存在
            return i+1;
    }
    return -1;

这个题目也可以稍作改变

字符串的删除

题目描述:
给定一个字符串A,在A中找到第一次出现的字串B,并删除掉
如A= “ABCDEF”,B = “CD” ,则返回A= “ABEF”。
分析:
关键问题就是找到CD的起始位置,从而可以找到CD结束位置,然后从结束位置开始后面的值都赋给起始位置开始的值。

找到出现一次的字符

题目描述:
在一个字符串中找到第一个只出现一次的字符,如输入abaccdeff,则输出b。
分析:最先想到的就是hashtable,字符作为key ,次数作为value,先统计,再遍历找到第一个value= 1的项,返回它的key。

#inclue <stdio.h>
#define SIZE 256
char Find(char * str)
{
    int hashtable[SIZE] = {0};
    char * temp = str;
    while(*temp != '\0')
        hashtable[*temp++]++;
    while(*str != '\0')
    {
        if(hashtable[*str] == 1)
            return *str;
        str++;
    }
    return '\0';
}

如果你觉得数组占用内存太大,那么可以缩小,其实就是加一个映射,把str[i] - ‘a’。范围变小,其他的都没有变化。

字符串拷贝strcpy

题目描述:实现库函数strcpy
原型声明:char * strcpy(char * dest,char * src);
功能:把src所指字符串复制到dest所指数组中。

char * strcpy(char * dest ,char * src)
{
    if(dest == src)
        return dest;
    assert(dest != NULL && src != NULL);
    char * temp = dest;
    while((*dest ++ = *src++) !='\0')

    return temp;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章