字符串A中刪除字符串B中所有字符

一、問題描述

輸入兩個字符串,從第一字符串中刪除第二個字符串中所有的字符。
例如,輸入A串”They are students.”和B串”aeiou”,則刪除之後的第一個字符串變成”Thy r stdnts.”

二、問題分析

此題分爲兩個部分來解答
    1)查找在A串中出現的B串字符
    2)刪除A串中的字符
對於第1)個問題,能做到快速查找的方法是二分和哈希,這裏明顯用哈希更合適,考慮到是字符,因此設置它們的asc11編碼作爲鍵,將B串錄入哈希表中,值爲0或者1。0表示該字符沒有在B串中,1表示該字符在B串中;
對於第2)個問題,考慮到每刪除一個i位置上的字符,需將i+1後面的字符往前挪,這樣在最差的情況下,會挪動(n-1+n-2+...+1)次,複雜度爲O(n^2),因此要想一個聰明的方法來降低複雜度。


這裏採用前後指針的方式。
初始狀態:*pSlow和*pFast指針都指向字符串串首位置
    1)當A[*pFast]在哈希表中的值爲0,說明該字符沒有出現在B中,可將此字符納入新串裏(新串相當於用*pSlow在原串中做覆蓋):A[*pSlow]=A[*pFast]; pSlow++ && pFast++
    2)當A[*pFast]在哈希表中的值爲1,說明該字符出現在B中,則跳過此值:pFast++
    3)當pFast走到串尾的時候,新串(覆蓋串)記得加'\0',*pSlow = '\0'

三、解題算法

/*******************************
author:tmw
date:2018-10-22
*******************************/
#include <stdio.h>
#include <stdlib.h>

char* deleAllElemInStrB(char* A, char* B)
{
    if(A == NULL || B == NULL) return NULL;

    /**建立長度爲256的哈希表,並做初始化**/
    int* hash_table = (int*)malloc(256*sizeof(int));
    int i;
    for(i=0; i<256; i++)
        hash_table[i] = 0;

    /**將B表元素存入hash表中**/
    char* temp = B;
    while(*temp != '\0')
    {
        hash_table[(int)(*temp)] = 1;
        temp++;
    }
    //定義倆指針,初始狀態都指向串首
    char* pSlow = A;
    char* pFast = A;
    while(*pFast != '\0')
    {
        /**如果*pFast指向的元素不在哈希表中,則納入新的覆蓋串**/
        if(hash_table[(int)(*pFast)] != 1)
        {
            *pSlow = *pFast;
            pSlow++;
            pFast++;
        }
        else
            pFast++;
    }
    /**記得新覆蓋串補上結束標記符**/
    *pSlow = '\0';
    return A;
}

夢想還是要有的,萬一實現了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~

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