您的位置:首页 > Web前端

剑指Offer——(34)第一个只出现一次的字符位置

2017-07-20 11:16 295 查看
题目描述:

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置

实现如下:

//在线测试用例非常的坑。。。→_→
//1.需要返回的是下标
//2.测试用例中区分大小写
//将所有的字符元素存放到<key, value>中,字符元素值为key,自定义结构体indexAndTime为value
//indexAndTime中保存此字符第一次出现的下标和一共出现的次数
//最后遍历str,在map中寻找字符元素,判断每一个元素的iAT中的time是否为1,若为1,return firstIndex
//注意
//有可能字符中没有只出现一次的字符,所以最后要有return -1!
class Solution
{
public:
struct indexAndTime//自定义结构体,记录字符元素第一次出现的下标和次数
{
int firstIndex;
int time;
};

int FirstNotRepeatingChar(string str)
{
if (str.empty()) return -1;//防御性动作

map<char, indexAndTime> m;
for (int i = 0; i < str.length(); ++i)
{
if (m.find(str[i]) != m.end())//若在map中找到,就直接++time
++(m[str[i]].time);
else//若未找到,就添加新的<key, value>
{
indexAndTime iAT = { i, 1 };
m.insert(make_pair(str[i], iAT));
}
}

map<char, indexAndTime>::iterator itMap;
for (int j = 0; j < str.size(); ++j)//寻找第一个只出现一次的字符的下标
{
itMap = m.find(str[j]);
if (itMap->second.time == 1)//找到返回下标
return itMap->second.firstIndex;
}
return -1;//特殊情况,有可能没有出现一次的情况!
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指Offer 算法