返回scala中给定字符串的旋转对等列表

时间:2019-06-29 04:09:11

标签: scala

输入字符串

  

[“ ac”,“ bd”,“ ce”,“ aaa”,“ xyz”,“ bbb”,“ abc”,“ kt”,“ zb”]

我想要以下输出:

  

[List(“ ac”,“ bd”,“ ce”,“ zb”),List(“ aaa”,“ bbb”),List(“ abc”,“ xyz”),List(“ kt” )]

这里的逻辑是我需要将类似的元素分组到列表中。

第一个列表中的模式是,我跳过了一个字母。

第二个列表中的模式是,我有一个字母重复三次。

第三个列表中的模式是,我连续3个字母。

将所有这些分组之后,我有一个不属于上述任何一种模式的元素,因此将其添加到单独的列表中。

我不确定scala中的算法/解决方案。任何帮助表示赞赏。 TIA。

3 个答案:

答案 0 :(得分:3)

构造字符串的旋转等价表示的方法。

  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))

答案 1 :(得分:1)

似乎是没有意义的锻炼。

val input = List("ac","bd","ce", "aaa","xyz","bbb","abc","kt","zb")

val (skip1, rest1) =
  input.partition(s => s.length == 2 && s(1)-s(0) == 2 || s(0)-s(1) == 24)
//skip1: List[String] = List(ac, bd, ce, zb)
//rest1: List[String] = List(aaa, xyz, bbb, abc, kt)

val (same3, rest2) =
  rest1.partition(s => s.length == 3 && s.forall(_ == s(0)))
//same3: List[String] = List(aaa, bbb)
//rest2: List[String] = List(xyz, abc, kt)

val (seq3, rest3) =
  rest2.partition(s => s.length == 3 && s(1)-s(0) == 1 && s(2)-s(1) == 1)
//seq3: List[String] = List(xyz, abc)
//rest3: List[String] = List(kt)

答案 2 :(得分:1)

这是该问题的通用解决方案。

    jQuery(document).ready( function($) {    
        $("#searchFormSubmit").click(function() {
            event.preventDefault();
            console.log("In First Part of Search Submit!");
            var address = $('#address').val();
        $.ajax({
                url : the_ajax_script.ajaxurl,
                type : 'post',
                data : {
                    action : 'travel_app_ajaxdata',
                    thangs : $('#CoreSearchForm').serialize()
                },
                success : function( response ) {
                    returnData = JSON.parse(response);
                     console.log("This is my Clean HTML" + returnData[0]);
                     console.log("This is my Location" + returnData[1]);
                      console.log("TEST DATA - EVENT: " + returnData[1]["resultsPage"]);
                    $('.return_data').html(returnData[0]);
},
            error: function(XMLHttpRequest, textStatus, errorThrown) { 
        alert("Status: " + textStatus); alert("Error: " + errorThrown); 
        } 
        });
    });

});

通过计算一对字母之间的距离,然后将“旋转组”表示为字符串中每个相邻对之间的距离的列表来工作。

这是带有错误检查功能的带注释版本:

def rotationGroup(s: String) =
  s.sliding(2).toList.map(s => ('a' + s(1) - s(0)) % 26)

list.groupBy(rotationGroup).values