转载

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

<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; 
}


 
 

正文到此结束
本文目录