--- title: '387. First Unique Character in a String' description: Given a string s, find the first non-repeating character in it and return its index. If it does not exist, return -1 icon: dot topics: - { name: "Hash Table", slug: "hash-table" } - { name: "String", slug: "string" } - { name: "Queue", slug: "queue" } - { name: "Counting", slug: "counting" } video: "rBENYgWy3xU" companies: - { name: "Amazon", period: "Thirty Days", frequency: 48.9 } - { name: "Yandex", period: "Three Months", frequency: 76.1 } - { name: "tcs", period: "Three Months", frequency: 73.7 } - { name: "Bloomberg", period: "Three Months", frequency: 46.8 } - { name: "Meta", period: "Three Months", frequency: 43.3 } - { name: "Google", period: "Three Months", frequency: 23.9 } - { name: "EPAM Systems", period: "Six Months", frequency: 76.2 } - { name: "Goldman Sachs", period: "Six Months", frequency: 59 } - { name: "Microsoft", period: "Six Months", frequency: 32 } sidebar: label: 'First Unique Character in a String' badge: 'Easy' --- ### Example 1: - Input: `s = "leetcode"` - Output: `0` - Explanation: The character `'l'` at index `0` is the first character that does not occur at any other index. ### Example 2: - Input: `s = "loveleetcode"` - Output: `2` ### Example 3: - Input: `s = "aabb"` - Output: `-1` ### Constraints: - `1 <= s.length <= 10^5` - `s` consists of only lowercase English letters. ## Approach ```mermaid flowchart TD S(["firstUniqChar(s)"]) --> F["Pass 1 — freq: count every char of s"] F --> L{"Pass 2 — more i in 0..len-1?"} L -- no --> E(["return -1"]) L -- yes --> Q{"freq[s[i]] == 1?"} Q -- yes --> R(["return i — leftmost wins because the scan is in order"]) Q -- no --> L ``` ## Solution ```js /** * @param {string} s * @return {number} */ var firstUniqChar = function (s) { const freq = {}; for (let c of s) freq[c] = (freq[c] || 0) + 1; for (let i = 0; i < s.length; i++) { if (freq[s[i]] === 1) { return i; } } return -1; }; ```