劍指Offer——(34)第一個只出現一次的字符位置

題目描述:

在一個字符串(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;//特殊情況,有可能沒有出現一次的情況!
    }
};
發佈了107 篇原創文章 · 獲贊 36 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章