从一个字符串(A)中删去另一个字符串(B)中已经出现的字符

来源:互联网 发布:alpine linux apk add 编辑:程序博客网 时间:2024/05/02 06:01

<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);">从一个字符串(A)中删去另一个字符串(B)中已经出现的字符</span>

1.首先要对另一个字符串进行标记

标记的方法有很多我举一个例子:

用一个bool数组来存26个字母并且对他们初始化为false,如果另外那个字符串存在,则将它变为true

比如 num[2]=true,就是说明 b 这个字符出现于另外一个字符串

2.就是去掉那些在A中已经被标记的字符

你可以用移动的方法去掉它:(这种方法的时间复杂度为n*n)不提倡

for(int i=0;i<n;i++)

{
    k=A[i]-'a';
  if(num[k])
  {
  for(int j=i;j<n-1;j++)
  A[j]=A[j+1];

  n--;
  }

}

另外的一种方法,时间复杂度为n

我们可以设置两个指针 low ,high,开始的时候他们都指向A字符串的第一个元素即 low=high=A;

当high指针指向的字符不是ture,我们将*low=*high 并且 low++ ,high++;

当high指针指向的字符是ture,我们直接high++,其他的不处理;

之后我们需要把踢出去的字符截断,直接*low='\0';

之后直接打印出字符串A;OK 了

话不多说,直接上代码,是最详细的!如果有问题的话,可以直接评论,我会尽快回答的!
<pre name="code" class="cpp">#include<iostream> using namespace std;#include<cstring>bool visited[26]; //设置全局的bool数组,来标记字符的状态int main() {  int i,len1,len2,num;  char str1[100];  char str2[100];  cin>>str1>>str2;//输入字符串  for(i=0;i<26;i++)   visited[i]=false;//初始化标志数组  len1=strlen(str1);  len2=strlen(str2);    for(i=0;i<len2;i++)//对字符串2中出现的字符进行标志    {    num=str2[i]-97;    visited[num]=true;   } /*下面是这个程序的核心*/   char *high,*low;//对两个指针初始化,指向字符串的第一个字符   high=low=str1; while(*high!='\0')  {     if(!visited[*high-97])    {  *low=*high;  high++;  low++;   }   else   high++;//直接跳过     }  *low='\0';//直接截断字符串,删去多余的字符 if(str1[0]=='\0')  cout<<"字符串1中的字符与字符串2中的字符完全重复"<<endl;  else cout<<str1<<endl; return 0; }




0 0