笔试题 brotherword【tire || hash】

给定一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词,例如单词army和mary互为兄弟单词。现在给定一个字典,用户输入一个单词,如何根据字典找出这个单词有哪些兄弟单词?要求时间和空间效率尽可能的高。

方案一:

用hash来做  head中保存的是 排好序的字母顺序  例如  给你bac  那么head中保存的就是abc

然后建立hash表

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <map>
 5 using namespace std;
 6
 7 const int maxn = 1005;
 8
 9 map<string, int> head;
10 struct Edge {
11     string to;
12     int next;
13 }e[maxn];
14 int tot;
15 void init() {
16     head.clear();
17     tot = 1;
18 }
19
20 void add(string s1, string s2) {
21     e[tot].to = s2;
22     e[tot].next = head[s1];
23     head[s1] = tot++;
24 }
25
26 void cal(string s1) {
27     for(int i = head[s1]; i; i = e[i].next) {
28         cout << e[i].to << " ";
29     } puts("");
30 }
31
32 int main() {
33     int n;
34     scanf("%d",&n);
35     for(int i = 0; i < n; i++) {
36         char s1[10], s2[10];
37         scanf("\n%s",s1);
38         strcpy(s2, s1);
39         int l = strlen(s2);
40         sort(s2, s2 + l);
41         string x1 = s2;
42         string x2 = s1;
43         add(x1, x2);
44     }
45     for(int i = 0; i < n; i++) {
46         char s1[10], s2[10];
47         scanf("\n%s",s1);
48         strcpy(s2, s1);
49         int l = strlen(s2);
50         sort(s2, s2 + l);
51         string x1 = s2;
52         string x2 = s1;
53         cal(x1);
54     }
55 }

方案二:

用字典树来做

用字典树建树的时候注意按照排好序的字符串建树,然后在叶子节点上放置改点的原串。

时间: 2024-10-29 19:12:07

笔试题 brotherword【tire || hash】的相关文章

C++经典笔试题详解

1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用 2.引用与指针有什么区别? 1) 引用必须被初始化,指针不必. 2) 引用初始化以后不能被改变,指针可以改变所指的对象.

java面试笔试题大汇总

java面试笔试题大汇总(一)JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),

java笔试题(3)

short a = 1; a = a + 1; 有错吗? short a = 1; a += 1; 有错吗? 对于short a = 1; a = a + 1;由于a + 1 运算时会自动提升表达式的类型,所以结果是int型,再复制short类型a时,编译器将报告需要强制装换类型的错误. 对于short a = 1; a += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译. 静态变量和实例变量的区别? 在语法定义上的区别:静态变量前要加stati

java常见面试题——java笔试题总结

注:本文转载自http://www.cnblogs.com/huajiezh/p/5790928.html,版权归其所有! Java常见面试题总结 一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. 3.说说你知道的几个Java集合类:list.set.queue.map实现类咯... 4.描述一下ArrayList和LinkedList各自实现和区别 5.Java中的队列都有哪些,有什么区别. 6.反射中,Class.forName和cl

转载 遇到过的一些php笔试题

遇到过的一些php笔试题 1.linux的多线程和多进程有什么区别?什么时候使用多线程,什么时候使用多进程? 答:(1)进程资源调度的最小单位,线程是cpu调度的最小单位:多进程开销大,多线程开销小,这是最基本的区别:一个进程里面可能有很多线程,把进程分解为线程之后就可以有效利用cpu和内存 (2)当需要频繁创建和销毁时优先选用多线程: 需要进行大量计算的优先使用线程: 强相关的处理用线程,弱相关的处理用进程:    可能要扩展到多机分布的用进程,多核分布的用线程: 都满足需求的情况下用最熟悉最

C/C++ 笔试题

/////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程和线程的差别. 线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问

10月12日笔试题总结

10/12,昨天参加了一套c/c++基础知识的笔试题,题目不难却有些偏门,笔试中个人感觉有如下问题需要重视: 指针与引用指向的内存位置;变量调用之堆和栈.(关于堆和栈的知识) char c=134;printf("%d",c);printf("%u",c);(整数和字符型相互转换的问题) 位操作:位与&.异或^.非~和移位(<<.>>),位或|(考试中,被当成数理逻辑的合取算符来用了,很长时间不用位或,关键时刻掉链子): 二进制.十六

【转】嵌入式软件工程师经典笔试题

嵌入式软件工程师经典笔试题 > 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中 有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3).

腾讯web前端开发工程师笔试题及答案

1. 如何实现事件委托? 首先要知道什么是事件委托. 考虑一个列表,在li的数量非常少的时候,为每一个li添加事件侦听当然不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(当然只是一个解释,实际工作中很少遇到这么多li的情况),为每个li添加事件侦听就会对页面性能产生很大的影响. 就像下面这段代码: <!DOCTYPE HTML><html><head><meta charset="utf-8" /><ti