Улучшение логики c, чтобы найти циклическое c вращение на заданной строке1, может произвести строку2 - PullRequest
0 голосов
/ 13 марта 2020

Найти, может ли вращение циклического c на заданном string1 произвести string2?

Примеры: -

string1 = abcd

string2 = cdab

выход = true

строка1 = abc

строка2 = bac

выход = false

Я пытаюсь улучшить эту логику c, уменьшив сложность с n^2 до n и n до n-k, заставив эту функцию checkRotation завершать работу после нахождения первого true.

//complexity n^2
def checkRotation(string1: String, string2: String): Boolean = {
  for (i <- 0 until string1.length) yield {
    for (j <- 0 until string2.length) yield {
      if (string1.charAt(i) == string2.charAt(j)) {
        string1 == string2.substring(j) + "" + string2.substring(0, j)
      } else {
        false
      }
    }
  }
}.flatten.contains(true)

//complexity n
  def checkRotation(string1: String, string2: String, index: Int = 0): Boolean = {
    if (index < string2.length) {
      if (string1.charAt(0) != string2.charAt(index)) {
        checkRotation(string1, string2, index + 1)
      } else {
        string1 == string2.substring(index) + "" + string2.substring(0, index)
      }
    } else {
      false
    }
  }

Есть улучшения? Спасибо !!!

РЕДАКТИРОВАТЬ

 def checkRotation(string1: String, string2: String, index: Int = 0): Boolean = {
    if (index < string2.length && (string1.charAt(0) != string2.charAt(index)
        || !string1.contains(string2.substring(index) + "" + string2.substring(0, index)))) {
      checkRotation(string1, string2, index + 1)
    } else {
      index < string2.length
    }
  }

1 Ответ

5 голосов
/ 13 марта 2020

Попробуйте это:

(string1 + string1).contains(string2)
...