轨道
/
Haskell
Haskell
/
练习
/
变位词
变位词

变位词

中等

简介

在一场旧货出售上,你以超低的价格淘到了一台漂亮的复古打字机!你兴奋地跑回家,塞进一张纸,就开始噼里啪啦地打字。可当你查看输出时,兴奋劲儿却一下子没了:所有单词都乱了套!比如,它打印出的不是 “post” 而是 “stop”,不是 “stale” 而是 “least”。你小心翼翼地又试了一次,这回它打印出的却是 “spot” 和 “slate”。经过一番摸索,你发现每个字母被打印出来之前都有一段随机延迟,正是它打乱了顺序。这下你明白了,难怪它卖得这么便宜!

你意识到,这个毛病恰好能用来生成变位词,也就是把另一个单词的字母重新排列后组成的单词。你对自己的发现很满意,于是用这一天剩下的时间生成了数百个变位词。

说明

你的任务是:给定一个目标单词和一组候选词,找出其中所有是目标单词变位词的那些候选词。

变位词是指把字母重新排列,组成一个新单词:例如 "owns" 是 "snow" 的变位词。 一个单词_不是_它自己的变位词:例如,"stop" 不是 "stop" 的变位词。

目标单词和候选词都是由一个或多个 ASCII 字母字符(A-Z 和 a-z)组成的单词。 小写字母和大写字母是等价的:例如,"PoTS" 是 "sTOp" 的变位词,但 StoP 不是 sTOp 的变位词。 变位词集合是候选集合中所有目标单词变位词组成的子集(顺序不限)。 变位词集合中的单词应与候选集合中的单词保持相同的大小写。

给定目标单词 "stone" 和候选词 "stone"、"tones"、"banana"、"tons"、"notes"、"Seton",变位词集合是 "tones"、"notes"、"Seton"。

提示

要完成这道练习,你需要实现函数 anagramsFor。它接收一个单词和一组单词,并返回其中是给定单词的变位词的那些。

你必须按照候选单词中列出的顺序返回这些变位词。

如果是你第一次做这道练习,建议先使用下面提供的函数签名:

anagramsFor :: String -> [String] -> [String]

之后,不妨回头重新做一遍这道题,试试其他数据类型和库:

  • 来自text包的 Text。
  • 来自containers包的 Sequence 和 Set。
  • 来自multiset包的 MultiSet。

测试套件特意设计成几乎接受任何合理的类型签名,所以鼓励你去找出你认为最好的那一个。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Haskell Exercism

准备好开始 变位词 了吗?

注册 Exercism,借助 107 个练习 和真人导师指导,学习并掌握 Haskell,全部免费。