题目
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。
例如,输入”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-10-05 04:25:58