只允许遍历一次字符串,统计只出现一次的字符串。由于只允许遍历一次,显然逐个比较检查的方法不行,可以通过hash方法统计字符串中字符出现次数,并额外用一个数组来存储字符串中第一次出现的字符,然后通过重新遍历第一次出现的字符数组,输出其对应hash值为1的字符则为原字符串中只出现一次的字符,时间复杂度为O(N)
#include<stdio.h>
#include<iostream>
using namespace std;
void getonce (char *str){
int hash[256] ={0};
int k=0;
char *order=(char *)malloc(strlen(str)+1);
while(*str != '\0'){
hash[int(*str)]++;
if (hash[int(*str)] == 1)
order[k++] = *str;//用来存放第一次出现的字符
str++;
}
order[k] = '\0';
k=0;
while(order[k]!='\0'){
if(hash[int(order[k])] == 1) //查找第一次出现字符对应hash值,如果等于1,说明是只出现一次。
cout<<order[k]<<endl;
k++;
}
}
int main(){
char *s="abdfdfacef";
getonce(s);
return 0;
}