https://leetcode.com/problems/first-unique-character-in-a-string/description/ios
Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1.算法
Examples:ide
s = "leetcode" return 0. s = "loveleetcode", return 2.
Note: You may assume the string contain only lowercase letters.spa
1 // 2 // main.cpp 3 // LeetCode 4 // 5 // Created by Hao on 2017/3/16. 6 // Copyright © 2017年 Hao. All rights reserved. 7 // 8 9 #include <iostream> 10 #include <vector> 11 #include <unordered_map> 12 using namespace std; 13 14 class Solution { 15 public: 16 // Only considering 26 ASCII characters 17 int firstUniqChar(string s) { 18 vector<int> dict(26, 0); 19 20 for (auto& ch : s) { 21 ++ dict[ch - 'a']; 22 } 23 24 for (int i = 0; i < s.size(); i ++) { 25 if (dict[s.at(i) - 'a'] == 1) 26 return i; 27 } 28 29 return -1; 30 } 31 32 // Common way for UNICODE characters 33 int firstUniqChar2(string s) { 34 unordered_map<char, int> dict; // character and index 35 36 for (auto& ch : s) { 37 ++ dict[ch]; 38 } 39 40 for (int i = 0; i < s.size(); i ++) { 41 if (dict[s.at(i)] == 1) 42 return i; 43 } 44 45 return -1; 46 } 47 48 // Only traverse the string once 49 int firstUniqChar3(string s) { 50 unordered_map<char, int> dict; 51 52 for (int i = 0; i < s.size(); i ++) { 53 if (dict.end() == dict.find(s.at(i))) // pay attention to the condition check 54 dict[s.at(i)] = i; 55 else 56 dict[s.at(i)] = INT_MAX; // for the dup 57 } 58 59 int res = INT_MAX; 60 61 for (auto& it : dict) { 62 res = min(res, it.second); 63 } 64 65 return res == INT_MAX ? -1 : res; 66 } 67 }; 68 69 int main(int argc, char* argv[]) 70 { 71 Solution testSolution; 72 73 vector<string> strs {"", "leetcode", "loveleetcode"}; 74 75 /* 76 -1 77 -1 78 -1 79 0 80 0 81 0 82 2 83 2 84 2 85 */ 86 for (auto s : strs) { 87 cout << testSolution.firstUniqChar(s) << endl; 88 cout << testSolution.firstUniqChar2(s) << endl; 89 cout << testSolution.firstUniqChar3(s) << endl; 90 } 91 92 return 0; 93 }