《劍指Offer》:刪除在另一個字串中出現的字元
阿新 • • 發佈:2019-02-12
題目
題目:輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。
例如,輸入”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;
}
總結
無論是在一個字串中刪除重複的字元時,還是刪除第一個字串中所有第二個字串中含有的字元時,都可以開闢一段空間來完成。