数据结构编程题:Phone List

题源

以下题面由GPT3.5翻译并生成题解

题目描述

给定一个电话号码列表,判断是否一致,即没有一个号码是另一个号码的前缀。比如电话目录列出了以下号码:

  • 紧急电话 911
  • 爱丽丝 97 625 999
  • 鲍勃 91 12 54 26

在这种情况下,无法拨打鲍勃的电话,因为只要你拨打了鲍勃电话号码的前三位数字,中心就会立即将你的电话转接到紧急线路。因此,这个列表是不一致的。

输入

输入的第一行给出一个整数,1 <= t <= 40,表示测试用例的数量。每个测试用例以一行单独的电话号码数量 n 开始,电话号码数量满足 1 <= n <= 10000。然后是 n 行,每行一个唯一的电话号码。电话号码是最多十位数字的序列。

输出

对于每个测试用例,如果列表一致,则输出“YES”,否则输出“NO”。

输入样例 1 

2
3
911
97625999
91125426
5
113
12340
123440
12345
98346

输出样例 1

NO
YES

题解

提示

由于需要对字符串前缀进行判断,不难考虑到应使用字典(Trie)树进行求解。

实现代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PHONE_LENGTH 11
typedef struct TrieNode {
    struct TrieNode* children[10];
    int isEndOfWord;
} TrieNode;
TrieNode* createTrieNode() {
    TrieNode* node = (TrieNode*)malloc(sizeof(TrieNode));
    for (int i = 0; i < 10; ++i) {
        node->children[i] = NULL;
    }
    node->isEndOfWord = 0;
    return node;
}
int insertPhoneNumber(TrieNode* root, const char* phoneNumber) {
    TrieNode* current = root;
    for (int i = 0; i < strlen(phoneNumber); ++i) {
        int index = phoneNumber[i] - '0';
        if (current->children[index] == NULL) {
            current->children[index] = createTrieNode();
        }
        current = current->children[index];
        if (current->isEndOfWord) {
            return 0;
        }
    }
    current->isEndOfWord = 1;
    for (int i = 0; i < 10; ++i) {
        if (current->children[i] != NULL) {
            return 0;
        }
    }
    return 1;
}
void freeTrie(TrieNode* root) {
    if (root == NULL) return;
    for (int i = 0; i < 10; ++i) {
        freeTrie(root->children[i]);
    }
    free(root);
}
int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        int n;
        scanf("%d", &n);
        TrieNode* root = createTrieNode();
        int consistent = 1;
        for (int i = 0; i < n; ++i) {
            char phoneNumber[MAX_PHONE_LENGTH];
            scanf("%s", phoneNumber);
            if (!consistent) {
                continue;
            }
            consistent = insertPhoneNumber(root, phoneNumber);
        }
        printf("%s\n",consistent?"YES":"NO");
        freeTrie(root);
    }
    return 0;
}

posted @   椰萝Yerosius  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示