387. 字符串中的第一个唯一字符


给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

  示例:

    s = "leetcode"       返回 0

    s = "loveleetcode"   返回 2

===========================================================

思路:

我想到的是两次hash,用string来做索引,如果两个字符相同,第二个会把第一个覆盖,比如lol,在map中应该是{{'l',2},{'0'1}}

上代码:

class Solution {
public:
    int firstUniqChar(string s) {
        unordered_map<char, int> map;
        for (int i = 0; i < s.size(); i++) {
            map[s[i]] = i;
        }
        for (int j = 0; j < s.size(); j++) {
            if (map[s[j]] == j)
                return j;
            else
                map[s[j]] = j;
        }
        return -1;
    }
};

时间复杂度为O(n),但是运行之后效率比较慢,不知道什么原因,看到题解中有用string方法的

class Solution {
public:
    int firstUniqChar(string s) {
        for (int i = 0; i < s.length(); i++) {
            if (s.find_first_of(s[i])== s.find_last_of(s[i])) {
                return i;
            }
        }
        return -1;
    }
};

查找的时间复杂度是O(n),如果第k次才找到那个字符的话,复杂度应该是O(k*n),按理说这样的解法应该会比较慢才对,但是运行时间在leetcode中比较快,就挺奇怪哈哈

相关