1. 程式人生 > >華為筆試—在字串A中刪除字串B中的全部字元

華為筆試—在字串A中刪除字串B中的全部字元

例如,輸入”They are students.”和”aeiou”,則刪除之後的第一個字串變成”Thy r stdnts.”。

思路:不可避免的是遍歷第一個字串,如果遍歷一個字元,都需要去第二個字串中查詢其存不存在,那麼複雜度會是O(nm),當然由於字元數有限,所以m是個常量。關於查詢速度最快的當然是hash表,對於8位字元,size=2^8足矣。

關於刪除字元,後面的字元要往前移,如果每刪除一個就移一次,O(n^2)這複雜度實在太高。

僅僅用快慢指標就可以搞定,這個方法非常有用,比如求解迴圈連結串列倒數第K個元素,中間元素.....。

初始化:快慢指標指向第一個字元

迴圈:如果快指標指的是不需要刪除的字元,將值賦給慢指標

後,快慢指標同時++;

           如果快指標指向待刪除字元,那麼直接++;

終止:快指標指向'\0'

  1. /*     
  2. * Copyright (c) 2011 alexingcool. All Rights Reserved.     
  3. */
  4. #include <iostream>
  5. #define NUMBER 256
  6. usingnamespace std;  
  7. char firstArray[] = "They are students.";  
  8. char secondArray[] = "aeiou";  
  9. constint firstSize = sizeof
     firstArray / sizeof *firstArray;  
  10. constint secondSize = sizeof secondArray / sizeof *secondArray;  
  11. bool flag[NUMBER];  
  12. void deleteArray(char *firstArray, char *secondArray)  
  13. {  
  14.     if(firstArray == NULL || secondArray == NULL)  
  15.         return;  
  16.     for(int i = 0; i < NUMBER; i++) 
  17.     {  
  18.         flag[i] = false
    ;  
  19.     }  
  20.     for(int i = 0; i < secondSize; i++) 
  21.    {  
  22.         int pos = static_cast<int>(secondArray[i]);  
  23.         flag[pos] = true;  
  24.     }  
  25.     char *fast = firstArray, *slow = firstArray;  
  26.     while(*fast != '\0'
  27.     {  
  28.         if(flag[*fast] == false
  29.        {  
  30.             *slow = *fast;  
  31.             slow++;  
  32.         }  
  33.         fast++;  
  34.     }  
  35.     *slow = 0;  
  36. }  
  37. int main()  
  38. {  
  39.     deleteArray(firstArray, secondArray);  
  40.     cout << firstArray << endl;  
  41.     return 0;
  42. }