在字串中,尋找第一個只出現一次的字元

一隻鳥的天空發表於2014-05-11

在字串中,尋找第一個只出現一次的字元,如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;
	}


 

相關文章