算法學習(三)字符串查找,刪除,複製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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章