209 First Unique Character in a String

原题网址:https://www.lintcode.com/problem/first-unique-character-in-a-string/description

描述

给出一个字符串,找出第一个只出现一次的字符。

您在真实的面试中是否遇到过这个题?  

样例

对于 "abaccdeff"'b'为第一个只出现一次的字符.

标签
字符串处理
 
思路:用两个哈希表,一个统计每个字符出现次数,另一个统计字符的下标。遍历第一个哈希表,找到字符出现次数为1并且下标最小的return出去。
 
AC代码:
class Solution {
public:
    /**
     * @param str: str: the given string
     * @return: char: the first unique character in a given string
     */
    char firstUniqChar(string &str) {
        // Write your code here
     char result;
     int index=-1;
     int n=str.size();
     map<char,int> chCount;
     map<char,int> chIndex;

     for (int i=0;i<n;i++)
     {
         if (chCount.find(str[i])!=chCount.end())//统计字符数量;
         {
             chCount[str[i]]++;
         }
         else
         {
             chCount[str[i]]=1;
         }
         if (chIndex.find(str[i])==chIndex.end())//找到字符的第一个索引;
         {
             chIndex[str[i]]=i;
         }
     }

     map<char,int>::iterator it;
     for (it=chCount.begin();it!=chCount.end();it++)
     {
         if (it->second==1&&index==-1)
         {
             result=it->first;
             index=chIndex[it->first];
         }
         else if (it->second==1&&chIndex[it->first]<index)
         {
             result=it->first;
             index=chIndex[it->first];
         }
     }

     return result;
    }
};
总觉得这样有点麻烦,想了想把第二个哈希表去掉,统计字符次数时如果字符存在于哈希表中,数量- -,否则数量为1。最后返回哈希表第一个元素的first。想法很美好,然而思路有问题。代码提交后只通过部分数据,原因是这样只能消除数量为偶数个的字符,若字符数量为奇数且不为1,结果错误。

在网上搜了搜果然看到了更简洁的代码,真想拍自己一脑门……   参考:https://www.cnblogs.com/grandyang/p/5802109.html

只用一个哈希表统计字符数量,然后遍历字符串,若当前字符数量为1则返回该字符。

AC代码:

class Solution {
public:
    /**
     * @param str: str: the given string
     * @return: char: the first unique character in a given string
     */
    char firstUniqChar(string &str) {
        // Write your code here
    int n=str.size();
     map<char,int> chCount;
     for (int i=0;i<n;i++)
     {
         if (chCount.find(str[i])!=chCount.end())//统计字符数量;
         {
             chCount[str[i]]++;
         }
         else
         {
             chCount[str[i]]=1;
         }
     }
     for (int i=0;i<n;i++)
     {
         if (chCount[str[i]]==1)
         {
             return str[i];
         }
     }
    }
};

 

题目并不难,只是脑子经常驴了……

 

posted @ 2018-06-15 22:22  eeeeeeee鹅  阅读(456)  评论(0编辑  收藏  举报