scala - 从scala中的给定字符串返回旋转等价对列表
问题描述
输入字符串
["ac","bd","ce","aaa","xyz","bbb","abc","kt","zb"]
我想要以下输出:
[列表(“ac”,“bd”,“ce”,“zb”),列表(“aaa”,“bbb”),列表(“abc”,“xyz”),列表(“kt”)]
这里的逻辑是我需要将类似的元素分组到列表中。
第一个列表中的模式是,我跳过了一个字母。
第二个列表中的模式是,我有一个字母重复三次。
第三个列表中的模式是,我有 3 个连续的字母。
在对所有这些进行分组之后,我有一个元素不属于上述任何模式,因此将其添加到单独的列表中。
我不确定scala中的算法/解决方案。任何帮助表示赞赏。TIA。
解决方案
构造字符串的旋转等价表示的方法。
def normalizedRepresentation(str: String) = {
str.map(char => (char - str.charAt(0) + 'a').asInstanceOf[Char])
}
def rotationalEquivalenceRepresentation(str: String) = {
val normalizedStr = normalizedRepresentation(str)
normalizedStr.map(char => if (char < 'a') (char + 26).asInstanceOf[Char] else char.asInstanceOf[Char])
}
然后
scala> val input = List("ac","bd","ce", "aaa","xyz","bbb","abc","kt","zb")
input: List[String] = List(ac, bd, ce, aaa, xyz, bbb, abc, kt, zb)
scala> input.map(str => normalizedRepresentation(str))
res0: List[String] = List(ac, ac, ac, aaa, abc, aaa, abc, aj, aI)
scala> input.map(str => rotationalEquivalenceRepresentation(str))
res1: List[String] = List(ac, ac, ac, aaa, abc, aaa, abc, aj, ac)
scala>
scala> input.groupBy(str => rotationalEquivalenceRepresentation(str))
res2: scala.collection.immutable.Map[String,List[String]] = Map(abc -> List(xyz, abc), aaa -> List(aaa, bbb), ac -> List(ac, bd, ce, zb), aj -> List(kt))
scala> input.groupBy(str => rotationalEquivalenceRepresentation(str)).values.toList
res3: List[List[String]] = List(List(xyz, abc), List(aaa, bbb), List(ac, bd, ce, zb), List(kt))
推荐阅读
- javascript - 如何将 wavesurfer js 与新的 Laravel 项目集成
- javascript - 如何在 prestashop (1.7) 中创建 onclick ajax 函数并构建正确的 url 链接
- docker - Docker Swarm:节点恢复活动后重新应用服务的放置偏好
- apache - 从同一目录提供的 API 和静态 html
- c++ - 为什么在这种情况下编译器无法优化 vtable(静态关键字/单例模式)
- r - 如何将多个 2D R 图组合成一个 3D 图
- python - 如何使用 pyspark 随着时间的推移有效地实现 groupby 和后续滚动应用
- python-3.x - 如何在 python 中使用特定字符串删除 Power Point 幻灯片?
- html - 为什么这部分会在 Outlook Web 中出现空白?
- html - 如何在动态网页中使用@media 打印查询?我现在得到的只是一个空白页