在字符串中,寻找第一个只出现一次的字符,如str=“abddggdbacdd", 结果是c
三种方法:
1. 使用字符字典数组,每个元素是一个结构体,第一个字段记录字符出现的次数,第二个字段记录该字符在字符串中第一次出现的位置,
先遍历一遍字符串,对字符字典数组赋值,然后遍历一遍字符字典数组,找到第一个字段为1,且位置最小的字符即为需要寻找的字符。如下:
struct node{
int num; //出现次数
int index; //首次出现的位置
};
char str[100001];
scanf("%s",str);
node nodeArr[256];
int i=0;
while(i<256){
nodeArr[i].index=-1;
nodeArr[i].num=0;
++i;
}
char *p=str;
int index = 0;
while(*p!='\0'){
nodeArr[*p].index = index++;
++nodeArr[*p].num;
++p;
}
int minIndex = index;
i = 0;
while(i<256){
if(nodeArr[i].num==1){
if(nodeArr[i].index<minIndex)
minIndex = nodeArr[i].index;
}
++i;
}
printf("%c\n",str[minIndex]);
2.使用数组
与第一种方法的区别就是该数组也是字符字典数组,只是每个元素是记录该字符出现的次数,而不是一个结构体,并且在第二次遍历与第一种方法也不同
先遍历一遍字符串,对字符字典数组赋值,然后再遍历一遍字符串,第一个出现次数为1的字符便是需要寻找的字符。如下:
char str[100001];
scanf("%s",str);
int arr[256];
memset(arr,0,256*sizeof(int));
char *p=str;
while(*p!='\0'){
++(arr[*p]);
++p;
}
p = str;
int index = 0;
while(*p!='\0'){
if(arr[*p]==1){
printf("%c\n",*p);
break;
}
++p;
}
3.使用BitSet
char str[100001];
scanf("%s",str);
std::bitset<256> bitSet;
char *p=str;
while(*p!='\0'){
bitSet.flip(*p);
++p;
}
p = str;
while(*p!='\0'){
if(bitSet.test(*p)){
printf("%c\n",*p);
break;
}
++p;
}