字符串集合维护

维护一个字符串集合,并支持以下两种操作:

1)I x:向集合中插入一个字符串 x

2)Q x:询问字符串 x 在集合中出现了多少次。

给定 N 个操作,所有输入的字符串的总长度不超过 10^5,字符串仅包含小写英文字母。

输入格式

第一行包含一个整数 N,表示操作的数量。

接下来 N 行,每行包含一个操作,操作的格式为:

  • I x:向集合中插入字符串 x

  • Q x:询问字符串 x 在集合中出现的次数。

输出格式

对于每个 Q x 操作,输出字符串 x 在集合中出现的次数。

输入样例

5 I abc I abc Q abc Q xyz I xyz

输出样例

2 0

Java 实现

import java.util.Scanner;
import java.util.HashMap;

class TrieNode {
    HashMap children = new HashMap<>();
    int count = 0;
}

class Trie {
    private TrieNode root;

    public Trie() {
        root = new TrieNode();
    }

    public void insert(String word) {
        TrieNode node = root;
        for (char c : word.toCharArray()) {
            if (!node.children.containsKey(c)) {
                node.children.put(c, new TrieNode());
            }
            node = node.children.get(c);
        }
        node.count++;
    }

    public int query(String word) {
        TrieNode node = root;
        for (char c : word.toCharArray()) {
            if (!node.children.containsKey(c)) {
                return 0;
            }
            node = node.children.get(c);
        }
        return node.count;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        Trie trie = new Trie();

        for (int i = 0; i < N; i++) {
            String op = scanner.next();
            String word = scanner.next();
            if (op.equals("I")) {
                trie.insert(word);
            } else if (op.equals("Q")) {
                System.out.println(trie.query(word));
            }
        }
    }
}

Python 实现

class TrieNode:
    def __init__(self):
        self.children = {}
        self.count = 0

class Trie:
    def __init__(self):
        self.root = TrieNode()

    def insert(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.count += 1

    def query(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                return 0
            node = node.children[char]
        return node.count

def main():
    N = int(input())
    trie = Trie()

    for _ in range(N):
        op, word = input().split()
        if op == 'I':
            trie.insert(word)
        elif op == 'Q':
            print(trie.query(word))

if __name__ == "__main__":
    main()

C++ 实现

#include 
#include 
#include 

using namespace std;

struct TrieNode {
    unordered_map children;
    int count = 0;
};

class Trie {
private:
    TrieNode* root;
public:
    Trie() {
        root = new TrieNode();
    }

    void insert(const string& word) {
        TrieNode* node = root;
        for (char c : word) {
            if (node->children.find(c) == node->children.end()) {
                node->children[c] = new TrieNode();
            }
            node = node->children[c];
        }
        node->count++;
    }

    int query(const string& word) {
        TrieNode* node = root;
        for (char c : word) {
            if (node->children.find(c) == node->children.end()) {
                return 0;
            }
            node = node->children[c];
        }
        return node->count;
    }
};

int main() {
    int N;
    cin >> N;
    Trie trie;

    for (int i = 0; i < N; i++) {
        string op, word;
        cin >> op >> word;
        if (op == "I") {
            trie.insert(word);
        } else if (op == "Q") {
            cout << trie.query(word) << endl;
        }
    }

    return 0;
}

你可能感兴趣的:(面试题整理专题,算法)