数据结构编程题: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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具