删除主串中模式串出现的字符
生活随笔
收集整理的這篇文章主要介紹了
删除主串中模式串出现的字符
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
要求:輸入一個主串X和模式串Y,要求刪除主串X中在模式串Y中出現的所有字符。如:主串X:welcome to tencent. 模式串Y:aeio。則輸出結果為:wlcm t tncnt.
思路:最直接的思路就是用兩層for循環,外層for循環掃描主串X,內層for循環用來掃面當前主串X中的字符是否在模式串Y中出現,如果出現則去除該字符,即將從該字符往后到主串末尾全部字符往前移動一位。但這樣每次得掃描模式串,我們可以考慮用哈希表存儲模式串中出現的字符,即hashTable[*str]==1,然后只需在主串掃描時與哈希表中對應字符的下標中的值比較,若為1則表示應該去除。但這僅僅只降低了掃描模式串的復雜度. 接下來應該考慮減少在主串X中移動當前字符后面字符的次數。我們知道,事實上我們不需要每次刪除主串X中某個字符時就移動余下的全部字符,當一個字符需要被刪除的時候,我們把它所占的位置讓它后面的字符來覆蓋,也就相當于刪除了這個字符。基于快速排序對冒泡排序改進的思路,我們可以用兩個指針first,second,初始時都指向主串的起始位置,然后判斷first指向的字符是否需要刪除,是則first直接跳過,指向下一個字符。如果first指向的字符是不需要刪除的字符,那么把first指向的字符賦值給second指向的字符,然后first和second同時向后移動指向下一個字符,直至first指針到達主串X的末尾。這樣時間復雜度降低到了O(n). 基于上述思路代碼如下: #include<iostream> using namespace std;int hashtable[256]; void initTable(char *str) {memset(hashtable,0,sizeof(hashtable));char *p = str;while(*p!='\0'){hashtable[*p] = 1;p++;}p = NULL; } char *Delete(char *source, char *substr) {char *first = source;char *second = source;while(*first != '\0'){if(hashtable[*first] != 1)//如果主串中的字符在模式串中未出現{*second = *first;second++;}first++;}*second = '\0';return source; }int main() { int N = 20;char *source = (char *)malloc(sizeof(char)*N);char *substr = (char *)malloc(sizeof(char)*N);cout<<"source string : ";gets(source);cout<<endl<<"substring : ";gets(substr);initTable(substr);//初始化table數組cout<<Delete(source,substr)<<endl;return 1; }程序運行結果如下:
轉載于:https://www.cnblogs.com/hainange/p/6334065.html
總結
以上是生活随笔為你收集整理的删除主串中模式串出现的字符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7.0改变用户创建目录组权限
- 下一篇: [android] 网络html查看器