LCS-最长公共子序列scala实现

def main(args: Array[String]): Unit = {

    //    val var1 = "在两个字符串中,有些字符会一样"
    //    val var2 = "两串字符会"
    //
    //    println(LCS(var1, var2))


    val var1 = Array(1, 3, 4, 5, 6, 7, 7, 8)

    val var2 = Array(3, 5, 7, 4, 8, 6, 7, 8, 2)

    val storeArr: Array[Array[Int]] = Array.ofDim[Int](var1.length + 1, var2.length + 1)

    // 从上到下进行推导
    for (i <- 1 until var1.length + 1) {
      for (j <- 1 until var2.length + 1) {
        if (var1(i - 1) == var2(j - 1)) {
          storeArr(i)(j) = storeArr(i - 1)(j - 1) + 1
        } else {
          storeArr(i)(j) = Math.max(storeArr(i - 1)(j), storeArr(i)(j - 1))
        }
      }
    }

    println(storeArr.map(_.mkString(",")).mkString("\n"))

    // 反推获得最优解
    var var3 = new util.ArrayList[Int]()

    /**
      * index_a row index
      * index_b column index
      * 
      * 最长公共子串只向斜上方移动
      */
    def rec_left(index_a: Int, index_b: Int): Unit = {
      // 限定条件
      if (storeArr(index_a)(index_b) == 0) {
        return None
      }

      if (storeArr(index_a)(index_b) > 0) {
        if (var1(index_a - 1) == var2(index_b - 1)) {
          var3.add(var1(index_a - 1))
          //向斜上方移动
          rec_left(index_a - 1, index_b - 1)
        } else {
          // 判断是向左移 还是右移
          //左移动
          if (storeArr(index_a - 1)(index_b) > storeArr(index_a)(index_b - 1)) {
            rec_left(index_a - 1, index_b)
          } else if (storeArr(index_a - 1)(index_b) == storeArr(index_a)(index_b - 1)) {
            // 当完整序列中索引对应元素不相等,二维数组中该索引位置的左边位置的值 与 二维数组中该索引位置的右边位置的值相等 :向左移
            rec_left(index_a - 1, index_b)
          } else {
            rec_left(index_a, index_b - 1)
          }
        }
      }
      return
    }

    // 反推获得最优解
    var var4 = new util.ArrayList[Int]()
    def rec_right(index_a: Int, index_b: Int): Unit = {
      // 限定条件
      if (storeArr(index_a)(index_b) == 0) {
        return None
      }

      if (storeArr(index_a)(index_b) > 0) {
        if (var1(index_a - 1) == var2(index_b - 1)) {
          var4.add(var1(index_a - 1))
          //向斜上方移动
          rec_right(index_a - 1, index_b - 1)
        } else {
          // 判断是向左移 还是右移
          //左移动
          if (storeArr(index_a - 1)(index_b) > storeArr(index_a)(index_b - 1)) {
            rec_right(index_a - 1, index_b)
          } else if (storeArr(index_a - 1)(index_b) == storeArr(index_a)(index_b - 1)) {
            // 当完整序列中索引对应元素不相等,二维数组中该索引位置的左边位置的值 与 二维数组中该索引位置的右边位置的值相等 :向左移
            rec_right(index_a, index_b - 1)
          } else {
            rec_right(index_a, index_b - 1)
          }
        }
      }
      return
    }


    rec_left(var1.length, var2.length)

    println("----------------打印结果---------------------")
    val array: Array[AnyRef] = var3.toArray

    for (k <- 0 until array.length reverse) {

      print(array(k))

    }

    println("----------------打印结果---------------------")
    rec_right(var1.length, var2.length)

    val array2: Array[AnyRef] = var4.toArray()

    for (k <- 0 until array2.length reverse) {

      print(array2(k))

    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值