《剑指Offer》:删除在另一个字符串中出现的字符

题目

题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。

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

思路

利用两层for循环依次根据第二个字符串中出现的字符将第一个字符串中的同样的字符替换为 ‘\0’,然后将后面的字符移到前面即可;

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

 思路:
*/
#include<stdio.h>
#include<string.h>  

void deleteSecondStrAllCharInFirstStr(char *str1,char *str2){
    //先检查str1和str2
    if(str1==NULL||str2==NULL||str1==" "||str2==" "){
        return;
    }
    int len1=strlen(str1);
    int len2=strlen(str2);
    //利用两层for循环来讲str1中在str2中出现的字符全部用 ‘\0‘来替换掉
    for(int i=0;i<len2;i++){
        char ch=str2[i];
        for(int j=0;j<len1;j++){
            if(str1[j]==ch){
                str1[j]=‘\0‘;
            }
        }
    }
    //然后将str1中后面的字符替换到前面的 ‘\0‘
    int p=0;
    for(int i=0;i<len1;i++){
        if(str1[i]!=‘\0‘){
            str1[p++]=str1[i];
        }
    }
    str1[p]=‘\0‘; 

}
int main(void){
    char str1[1000];
    char str2[1000];
    gets(str1);
    gets(str2);
    deleteSecondStrAllCharInFirstStr(str1,str2);
    puts(str1);
    return 0;
} 

上面的思路虽然可以完成此功能,但是不过此方法的时间复杂度为 O(m*n),时间复杂度过大,我们需要改善

改善方法:开辟一个长度为26的数组空间,用空间来换取时间,这是我们常用的方法。

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

 思路: 第一种方法中我们应用了两层for循环来完成的,时间复杂度为O(m*n)
 这里了,我们换一种方法来降低时间复杂度:空间换取时间
*/
//这里要做一个假定:字符串全部有小写字母构成
#include<stdio.h>
#include<string.h>

void deleteSecondStrAllCharInFirstStr_1(char *str1,char *str2){
    //先检查str1、str2是否有效
    if(str1==NULL||str2==NULL||str1==" "||str2==" "){
        return ;

    }
    bool temp[26];
    memset(temp,0,sizeof(temp));//初始化  为 0
    int len1=strlen(str1);
    int len2=strlen(str2);

    for(int i=0;i<len2;i++){
        temp[str2[i]-‘a‘]=1;
    }
    int p=0;
    for(int i=0;i<len1;i++){
        if(!temp[str1[i]-‘a‘]){//判断str[i]是否是str2中出现的字符
            str1[p++]=str1[i];
        }
    }

    str1[p]=‘\0‘;
}
int main(void){
    char str1[1000];
    char str2[1000];
    gets(str1);
    gets(str2);
    deleteSecondStrAllCharInFirstStr_1(str1,str2);
    puts(str1);
    puts(str2);
    return 0;
}

总结

无论是在一个字符串中删除重复的字符时,还是删除第一个字符串中所有第二个字符串中含有的字符时,都可以开辟一段空间来完成。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-04 04:24:31

《剑指Offer》:删除在另一个字符串中出现的字符的相关文章

《剑指Offer》:移除字符串中重复的字符

题目: 移除字符串中重复的字符, 如abcadc移除后变为abcd, 注意:可以额外定义一两个变量,但不允许额外开辟一个数组. 思路 这里要求了空间复杂度为O(1),那我们只能用最简单的遍历方法,先让第一个字符与后面的字符一一比较,遇到重复的就把重复的字符用'\0'替换掉,再让第二个字符与右面的字符一一比较,遇到重复的,就把重复的字符用'\0'代替,如此循环,直到最后一个字符,当然同时还要在每次遇到'\0'时(重复字符出现的位置,已被填充为'\0'),将后面的字符移到前面来,替换掉'\0',最后

《剑指Offer》:移除字符串中重复的字符_2

题目 移除字符串中重复的字符,字符串由小写字母构成 如abcadc移除后变为abcd, 要求:时间复杂度尽可能小 与上篇博文(http://blog.csdn.net/u010412719/article/details/48086641)不一样的地方是:虽然都是移除字符串中重读的字符,但是这里的要求是时间复杂度尽可能小,对空间没有要求. 思路 思路:要求时间复杂度尽可能小而对空间没有限制,这就需要我们用控件换取时间 /* 移除字符串中重复的字符,字符串由小写字母构成 如abcadc移除后变为a

【剑指offer】删除在另一个字符串中出现的字符

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"They are students."和"aeiou",则删除之后的第一个字符串变成"Thy r stdnts.". 这里主要要分析两个方面: 1.如何判断那些字符是需要删除的字符.同很多字符串问题一样,可以开辟

剑指offer (48) c++实现一个不能被继承的类

题目:用c++实现一个不能被继承的类 题解分析: 常规解法: 首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数.同样,子类的析构函数也会自动调用父类的析构函数. 要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数. 那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数.析构函数而导致编译错误. 可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢? 这难不倒我们,我们可以通过定义静态函数来创建和释放类的实例.基于这个思路,我们可以

剑指offer (35) 第一个只出现一次的字符 字符哈希表

题目:在字符串中找出第一个只出现一次的字符 题解分析:用空间换时间,使用哈希表,key为字符,value是该字符出现的次数 字符是一个长度为8的数据类型,因此总共只有256种可能,我们可以创建一个长为256的数组, 每个字符根据其ASCII码值作为数组的下标,即哈希表的key,而相应数组位置存储每个字符出现的次数,即哈希表的value char GetFirstOnce(const char* str) { assert(str != NULL); const int hashSize = 25

剑指OFFER之第一个只出现一次的字符(九度OJ1283)

题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1. 样例输入: ABACCDEFF AA 样例输出: 1 -1 解题思路: 首先考虑到时间复杂度,对字符串进行排序或者双层扫描都会到达O(nlong)---O(n^2)的地步. 所以我们考虑额外使用一个数组进行计数,线性时间扫描数组,然后再按照原来的顺序扫描数组找到次数为

【剑指offer】第一个只出现一次的字符

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27106997 题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1. 样例输入: ABACCDEFF AA 样例输出: 1 -1 处理字符串中重复或者次数出现等问题,最常用的就是哈希表,用字符串中的字符作为key,

【剑指offer】数字在排序数组中出现的次数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27364557 题目描写叙述: 统计一个数字在排序数组中出现的次数. 输入: 每一个測试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每一个元素均为int. 第三行有1个整数m,表示接下来有m次查询.1<=m<=10^3. 以下有m行,每行有一个整数k,表示要查询的数. 输出: 相应每一个測试案例,有m行输出,

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt