zoukankan      html  css  js  c++  java
  • LeetCode 387. First Unique Character in a String

    https://leetcode.com/problems/first-unique-character-in-a-string/description/

    Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1.

    Examples:

    s = "leetcode"
    return 0.
    
    s = "loveleetcode",
    return 2. 

    Note: You may assume the string contain only lowercase letters.

    • 字符串判重简单题。基本思想就是用hash table。
    • 第一种方法只简单考虑26个ACSII英文字母,第二种扩展到更普遍的情况用map来处理Unicode字符,第三种则是只扫描输入字符串一次,然后扫描hash table一次。
    • 注意STL算法的使用。
    • unordered_map::find - C++ Reference
      • http://www.cplusplus.com/reference/unordered_map/unordered_map/find/
    • min - C++ Reference
      • http://www.cplusplus.com/reference/algorithm/min/?kw=min
    • <climits> (limits.h) - C++ Reference
      • http://www.cplusplus.com/reference/climits/
     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 }
    View Code
  • 相关阅读:
    HBase的完全分布式搭建
    研究Zookeeper的原理(二)
    研究Zookeeper的原理(一)
    zookeeper集群的搭建
    Hadoop之伪分布式安装
    MySQL忘记密码(终极解决方法,亲测有效,windows版本)
    MySQL重置密码(liunx)
    disconf---分布式配置管理平台的搭建(linux版本)
    zookeeper的安装(单机版)
    Redis搭建一主一从及哨兵模式(二)
  • 原文地址:https://www.cnblogs.com/pegasus923/p/8405755.html
Copyright © 2011-2022 走看看