编程珠玑变位词算法

问题描述

给定一个英语字典,找出其中的所有变位词集合。例如,“pots”,“stop”和“tops”互为变位词,因为每一个单词都可以通过改变其他单词中的字母顺序来得到。

解决思路

首先想到的方法应该是使用一个两层循环,遍历字典,然后再比较每个单词是否是变位词,在比较单词的时候,可以先对每个单词的所有字母进行排序,然后再比较,总的时间复杂度为O(m*logm*n2),也可以使用一个大小为26的字符数组做Hash来进行对比。这样的算法总的时间复杂度为O(m*n2)。对字典使用一个两层循环遍历,可见效率并不高。所以需要再考虑其他算法。

更好些的方法是,我们可以考虑为每个单词增加一个标识,然后再以标识对单词进行排序,这样排序后,相同标识的单词就分在一起,这样就找出了所有单词的变位词集合。可以将该方法分为以下三个步骤:

  1. 为每个单词增加一个标识,这个步骤的关键是怎么找每个单词的标识,使得一个单词的所有的变位词都又相同的标识,相当于找到一个Hash函数,使得一个单词的所有变位词都有相同的Hash值,合适的方式是对单词中的字母进行排序,如“pots”,“stop”和“tops”这三个单词是变位词,他们的标识是“opst”,即对单词中的字母按照字母顺序进行排序,最后得到标识为“opst”。
  2. 以单词的标识对字典中的单词排序,经过上面的处理,就得到了一个单词与标识的二元组,将这个二元组视为一个整体,可以使用一个结构体(或对象)来理解,比如结构体可以定义为:
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值