题目如下(002)

高效查找兄弟单词的算法
本文介绍了两种使用散列表(哈希表)和链表的方法来查找给定单词的兄弟单词,通过重新排列字母作为键或者质数相乘积作为键,实现O(1)时间复杂度的查询。

一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程。

方法引于:http://blog.youkuaiyun.com/yahohi/article/details/7985328

解法一:

使用hash_map和链表。 
首先定义一个key,使得兄弟单词有相同的key,不是兄弟的单词有不同的key。例如,将单词按字母从小到大重新排序后作为其key,比如bad的key为abd,good的key为dgoo。 
使用链表将所有兄弟单词串在一起,hash_map的key为单词的key,value为链表的起始地址。 
开始时,先遍历字典,将每个单词都按照key加入到对应的链表当中。当需要找兄弟单词时,只需求取这个单词的key,然后到hash_map中找到对应的链表即可。 
这样创建hash_map时时间复杂度为O(n),查找兄弟单词时时间复杂度是O(1)。

 

解法二:

同样使用hash_map和链表。

将每一个字母对应一个质数,然后让对应的质数相乘,将得到的值进行hash,这样兄弟单词的值就是一样的了,并且不同单词的质数相乘积肯定不同。

使用链表将所有兄弟单词串在一起,hash_map的key为单词的质数相乘积,value为链表的起始地址。

对于用户输入的单词进行计算,然后查找hash,将链表遍历输出就得到所有兄弟单词。

这样创建hash_map时时间复杂度为O(n),查找兄弟单词时时间复杂度是O(1)。


这里的n显而易见是指字典中的单词数目。由此可见,hash(散列表)可以有效的解决效率问题。

### 蓝桥杯竞赛中与DFS相关的题目及其编号 在蓝桥杯竞赛中,涉及深度优先搜索(Depth First Search, DFS)的题目种类繁多,主要分为两类:针对分配过程的DFS以及图或树结构上的DFS[^1]。这些题目通常具有一定的模板性质,难度属于中等水平。 #### 类型一:针对分配过程的DFS 这类问题涉及到资源或者对象之间的合理配置,通过递归尝试每一种可能的情况来寻找解决方案。例如,“飞机降落”是一个典型的例子,在这个问题里需要考虑多个变量间的组合关系以达到最优解。 #### 类型二:基于图/树结构的DFS 此类问题更侧重于遍历图形数据结构,如迷宫求解就是非常经典的应用场景之一。对于从起点到达终点是否存在路径、有多少种不同走法等问题都可以利用DFS来进行有效解答[^3]。 具体的一些带有编号的经典DFS题目如下: - **例题 1**: 飞机降落 (编号假设为LCQ001) - 迷宫系列问题 (编号范围可能是LCQ002-LCQ005),包括但不限于判断是否有通路、计算最短距离等变体形式 值得注意的是,除了上述提到的具体实例之外,还有其他许多未列出但同样重要的DFS应用场景存在于历年真题之中。为了更好地理解和掌握这一算法技巧,建议参赛者们广泛练习各种类型的DFS题目,并深入研究其背后的原理和技术细节[^2]。 ```cpp // C++代码片段展示如何实现简单的DFS函数框架 void dfs(int node){ visited[node]=true; cout << "Visit Node:" << node << endl; for(auto neighbor : adjList[node]){ if(!visited[neighbor]) dfs(neighbor); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值