/*
* 描述: 找出字符串中第一个只出现一次的字符
* 详细描述:
* 接口说明
* 原型:
* bool FindChar(char* pInputString, char* &pChar);
* 输入参数:
* char* pInputString:字符串
* 输出参数(指针指向的内存区域保证有效):
* char* pChar:第一个只出现一次的字符
* 如果无此字符 请输出'.'
* 知识点: 字符串,循环
* 题目来源: 内部整理
* 练习阶段: 初级
* 运行时间限制: 10Sec
* 内存限制: 128MByte
* 输入:
* 输入一串字符
* 输出:
* 输出一个字符
* 样例输入: asdfasdfo
* 样例输出: o
*/
#include <iostream>
#include <string>
#include <string.h>
#include <map>
#include <vector>
using namespace std;
struct MY_Pairs
{
int count;
map<int,int> position;
};
void Input(std::string &str);
bool FindChar(char* pInputString, char* pChar);
int main()
{
std::string str;
char* pInputString;
char pChar;
Input(str);
pInputString = const_cast<char*>(str.c_str());
bool result = FindChar(pInputString, &pChar);
if(!result)
{
return -1;
}
std::cout << pChar << endl;
system("pause");
return 0;
}
void Input(std::string &str)
{
getline(std::cin,str,'\n');
return;
}
bool FindChar(char* pInputString, char* pChar)
{
map<char,MY_Pairs> Statistics;
map<char,MY_Pairs>::iterator iter;
int len = strlen(const_cast<const char*>(pInputString));
char c;
/* 字符串为空字符串 */
if(len==0)
{
return false;
}
/* 分类 */
for(int i=0;i<len;i++)
{
c = pInputString[i];
iter = Statistics.find(c);
/* 找到这个关键字 */
if(iter!=Statistics.end())
{
iter->second.count++;
iter->second.position[iter->second.count]++;
}
else /* 没找到 */
{
MY_Pairs pairs_temp;
pairs_temp.count = 0;
pairs_temp.count++;
pairs_temp.position[pairs_temp.count]=i;
Statistics.insert(map<char,MY_Pairs>::value_type(c,pairs_temp));
}
}
/* 找出出现次数为1的字符 */
int Firstposition = len;
map<int,int>::iterator iter_first;
for(map<char,MY_Pairs>::iterator m_iter=Statistics.begin();m_iter!=Statistics.end();m_iter++)
{
if(m_iter->second.count == 1)
{
iter_first = m_iter->second.position.begin();
int kk = iter_first->second;
if(kk<Firstposition)
{
Firstposition = kk;
}
}
}
if(Firstposition==len)
{
const char pp2 = '.';
memcpy(pChar,&pp2,1);
return true;
}
/* 从字符串中取一个字符 */
const char pp = pInputString[Firstposition];
memcpy(pChar,&pp,1);
return true;
}