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中比较快,就挺奇怪哈哈
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理