笔试题 brotherword【tire || hash】
2015-09-07 01:00
176 查看
给定一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词,例如单词army和mary互为兄弟单词。现在给定一个字典,用户输入一个单词,如何根据字典找出这个单词有哪些兄弟单词?要求时间和空间效率尽可能的高。
方案一:
用hash来做 head中保存的是 排好序的字母顺序 例如 给你bac 那么head中保存的就是abc
然后建立hash表
View Code
方案二:
用字典树来做
用字典树建树的时候注意按照排好序的字符串建树,然后在叶子节点上放置改点的原串。
方案一:
用hash来做 head中保存的是 排好序的字母顺序 例如 给你bac 那么head中保存的就是abc
然后建立hash表
#include <iostream> #include <cstring> #include <cstdio> #include <map> using namespace std; const int maxn = 1005; map<string, int> head; struct Edge { string to; int next; }e[maxn]; int tot; void init() { head.clear(); tot = 1; } void add(string s1, string s2) { e[tot].to = s2; e[tot].next = head[s1]; head[s1] = tot++; } void cal(string s1) { for(int i = head[s1]; i; i = e[i].next) { cout << e[i].to << " "; } puts(""); } int main() { int n; scanf("%d",&n); for(int i = 0; i < n; i++) { char s1[10], s2[10]; scanf("\n%s",s1); strcpy(s2, s1); int l = strlen(s2); sort(s2, s2 + l); string x1 = s2; string x2 = s1; add(x1, x2); } for(int i = 0; i < n; i++) { char s1[10], s2[10]; scanf("\n%s",s1); strcpy(s2, s1); int l = strlen(s2); sort(s2, s2 + l); string x1 = s2; string x2 = s1; cal(x1); } }
View Code
方案二:
用字典树来做
用字典树建树的时候注意按照排好序的字符串建树,然后在叶子节点上放置改点的原串。
相关文章推荐
- 磁盘管理和文件系统管理(1)
- CCLayer解析
- 思维固化
- 【Java集合之二】Set集合
- poj 1651 Multiplication Puzzle(区间DP)
- someone
- RSA算法原理(二)
- HDU 4812 D Tree(树分治)
- cocos2dx骨骼动画Armature源码分析(二)
- css 选择器如何选择
- 9.7android注解支持,mysql优化,图片搜索
- iOS7自定义视图控制器过渡1-动作过渡
- ioS开发之UI基础--使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
- C&C++输入方法总结
- Shell基础之-awk命令
- 阿里腾讯2016校招在线笔试有感
- 浅谈C++中的单例模式
- swift详解之二十四---------------CoreAnimation(一)CALayer
- Iterated Tverberg Point-Implementation
- 科兴科学园简直是深圳游戏科技园