在字符串中,寻找第一个只出现一次的字符,如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; }
在字符串中,寻找第一个只出现一次的字符,布布扣,bubuko.com
原文:http://blog.csdn.net/heyongluoyao8/article/details/25551721