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中比较快,就挺奇怪哈哈