[Leetcode /ハッシュテーブル]第一(及び横断ハッシュ・テーブル)内の一意の文字列

問題の説明:

文字列を考えると、その最初の非反復文字を見つけると、そのインデックスを返します。ない場合は、-1を返します。

ケース:

S = "leetcode"
0を返します。

S = "loveleetcode"、
2を返します。

 

注:あなたは、文字列が小文字のみが含まれていることを前提とすることができます。

基本的な考え方:

文字文字の統計的なマッピングの数の確立が表示され、

そして、第一の要素1の統計情報の数を見つけます。

これは、特に注意を払う必要があります。

ハッシュテーブルが検索可能であることを私たちは皆知っています。

しかし残念ながら、内部unordered_mapは、ハッシュテーブルを使用して保存されている、と彼はハッシュ(フランス語、破砕)のです。言い換えれば、順序はありません。

最初のキーを挿入し便利なアクセスへの最初ではないかもしれません。

だから、最初の要素1の値を取得するトラバースハッシュマップには期待しないでください。

解決策は2つあります:

  1.  統計の数発生方法レコード指標の値として、対<整数、整数>タイプ
  2.  最後に、再び最初のスキャン文字列から、ヒットの値は、プロセスがすぐに返されます。

ACコード:

class Solution {
public:
    int firstUniqChar(string s) {
      map<char, pair<int, int>> hashmap;    // 第一个int统计次数,第二个int统计索引
      for (int i = 0; i < s.size(); ++i) {
        ++hashmap[s[i]].first;
        hashmap[s[i]].second = i;
      }
      // 特别注意由于是哈希实现的,这里遍历hashmap不能保证任何顺序
      int min = INT_MAX;
      for (auto it = hashmap.begin(); it != hashmap.end(); ++it) {
        if (it->second.first == 1) {
          if (it->second.second < min) min = it->second.second;
        }
      }
      return (min == INT_MAX)? -1 : min;
    }
};
class Solution {
public:
    int firstUniqChar(string s) {
        int len = s.length();
        if(len < 1){
            return -1;
        }
        vector<int> answer(26,0);
        for(int i = 0;i < len;i++){
            answer[s[i] - 'a']++;
        }
        for(int i = 0;i < len;i++){
            if(answer[s[i] - 'a'] == 1){
                return i;
            }
        }
        return -1;
    }
};

 

公開された137元の記事 ウォン称賛19 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_43338695/article/details/102740771