zoukankan      html  css  js  c++  java
  • (面试题)删除在另一个字符串中出现的字符

    题目:

    输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

    思路:

    通过hash表记录第二个字符串中出现的字符,hash表可以由长度为256的bool数组表示。

    然后遍历第一个字符串,每扫描一个字符,通过检查hash表判断该字符是否在第二个字符串出现过,如果是,则删除,否则继续。

    那么如果在字符串中删除字符呢?一般而言,每删除一个字符,后面的字符必须往前移,如果每个字符都需要这么操作的话,复杂度就很高了。

    解决办法:通过两个指针,一个用于遍历字符串pFast,一个用于删除字符pSlow,当pFast指针所指字符没有在第二个字符串出现过,则*pSlow=*pFast,pSlow++,即保留该位置的字符,否则,pSlow不变,当遍历完字符串之后,*pSlow='',以表示删除字符后的新字符串。

    代码:

    #include <iostream>
    
    using namespace std;
    
    void deleteChars(char* str1,char* str2){
        if(str1==NULL || str2==NULL)
            return;
        const int tableSize=256;
        bool hashTable[tableSize];
        for(int i=0;i<tableSize;i++)
            hashTable[i]=false;
        //memset(hashTable,0,sizeof(tableSize));
    
        int index;
        while(*str2!=''){
            if(*str2>=0)
                index=*str2;
            else
                index=*str2+256;
            hashTable[index]=true;
            str2++;
        }
    
        char* pSlow=str1;
        char* pFast=str1;
        while(*pFast!=''){
            if(*pFast>=0)
                index=*pFast;
            else
                index=*pFast+256;
            if(!hashTable[index]){
                *pSlow=*pFast;
                pSlow++;
            }
            pFast++;
        }
        *pSlow='';
    }
    
    int main()
    {
        char str1[] = "They are students";
        char str2[] = "Tt";
        deleteChars(str1,str2);
        cout<<str1<<endl;
        return 0;
    }
  • 相关阅读:
    目前流行的源程序版本管理软件和项目管理软件都有哪些, 各有什么优缺点?
    课程不懂的问题
    自我介绍
    .net发送邮件代码示例
    清除HTML中的特殊字符
    Html特殊字符转义处理
    截取字符窜(区分中英文)
    截取需要的字符串(非字节处理)
    区分24小时和12小时的时间格式转换为
    时间戳转为时间
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4676608.html
Copyright © 2011-2022 走看看