Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,65 @@
|
|||
def longestCommonSubstringsOptimizedPureFP(left: String, right: String): Option[Set[String]] =
|
||||
if (left.nonEmpty && right.nonEmpty) {
|
||||
val (shorter, longer) =
|
||||
if (left.length < right.length) (left, right)
|
||||
else (right, left)
|
||||
|
||||
@scala.annotation.tailrec
|
||||
def recursive(
|
||||
indexLonger: Int = 0,
|
||||
indexShorter: Int = 0,
|
||||
currentLongestLength: Int = 0,
|
||||
lengthsPrior: List[Int] = List.fill(shorter.length)(0),
|
||||
lengths: List[Int] = Nil,
|
||||
accumulator: List[Int] = Nil
|
||||
): (Int, List[Int]) =
|
||||
if (indexLonger < longer.length) {
|
||||
val length =
|
||||
if (longer(indexLonger) != shorter(indexShorter)) 0
|
||||
else lengthsPrior.head + 1
|
||||
val newCurrentLongestLength =
|
||||
if (length > currentLongestLength) length
|
||||
else currentLongestLength
|
||||
val newAccumulator =
|
||||
if ((length < currentLongestLength) || (length == 0)) accumulator
|
||||
else {
|
||||
val entry = indexShorter - length + 1
|
||||
if (length > currentLongestLength) List(entry)
|
||||
else entry :: accumulator
|
||||
}
|
||||
if (indexShorter < shorter.length - 1)
|
||||
recursive(
|
||||
indexLonger,
|
||||
indexShorter + 1,
|
||||
newCurrentLongestLength,
|
||||
lengthsPrior.tail,
|
||||
length :: lengths,
|
||||
newAccumulator
|
||||
)
|
||||
else
|
||||
recursive(
|
||||
indexLonger + 1,
|
||||
0,
|
||||
newCurrentLongestLength,
|
||||
0 :: lengths.reverse,
|
||||
Nil,
|
||||
newAccumulator
|
||||
)
|
||||
}
|
||||
else (currentLongestLength, accumulator)
|
||||
|
||||
val (length, indexShorters) = recursive()
|
||||
if (indexShorters.nonEmpty)
|
||||
Some(
|
||||
indexShorters
|
||||
.map {
|
||||
indexShorter =>
|
||||
shorter.substring(indexShorter, indexShorter + length)
|
||||
}
|
||||
.toSet
|
||||
)
|
||||
else None
|
||||
}
|
||||
else None
|
||||
|
||||
println(longestCommonSubstringsOptimizedPureFP("thisisatest", "testing123testing"))
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
def longestCommonSubstringsOptimizedReferentiallyTransparentFP(left: String, right: String): Option[Set[String]] =
|
||||
if (left.nonEmpty && right.nonEmpty) {
|
||||
val (shorter, longer) =
|
||||
if (left.length < right.length) (left, right)
|
||||
else (right, left)
|
||||
val lengths: Array[Int] = new Array(shorter.length) //mutable
|
||||
|
||||
@scala.annotation.tailrec
|
||||
def recursive(
|
||||
indexLonger: Int = 0,
|
||||
indexShorter: Int = 0,
|
||||
currentLongestLength: Int = 0,
|
||||
lastIterationLength: Int = 0,
|
||||
accumulator: List[Int] = Nil
|
||||
): (Int, List[Int]) =
|
||||
if (indexLonger < longer.length) {
|
||||
val length =
|
||||
if (longer(indexLonger) != shorter(indexShorter)) 0
|
||||
else
|
||||
if (indexShorter == 0) 1
|
||||
else lastIterationLength + 1
|
||||
val newLastIterationLength = lengths(indexShorter)
|
||||
lengths(indexShorter) = length //mutation
|
||||
val newCurrentLongestLength =
|
||||
if (length > currentLongestLength) length
|
||||
else currentLongestLength
|
||||
val newAccumulator =
|
||||
if ((length < currentLongestLength) || (length == 0)) accumulator
|
||||
else {
|
||||
val entry = indexShorter - length + 1
|
||||
if (length > currentLongestLength) List(entry)
|
||||
else entry :: accumulator
|
||||
}
|
||||
if (indexShorter < shorter.length - 1)
|
||||
recursive(
|
||||
indexLonger,
|
||||
indexShorter + 1,
|
||||
newCurrentLongestLength,
|
||||
newLastIterationLength,
|
||||
newAccumulator
|
||||
)
|
||||
else
|
||||
recursive(
|
||||
indexLonger + 1,
|
||||
0,
|
||||
newCurrentLongestLength,
|
||||
newLastIterationLength,
|
||||
newAccumulator
|
||||
)
|
||||
}
|
||||
else (currentLongestLength, accumulator)
|
||||
|
||||
val (length, indexShorters) = recursive()
|
||||
if (indexShorters.nonEmpty)
|
||||
Some(
|
||||
indexShorters
|
||||
.map {
|
||||
indexShorter =>
|
||||
shorter.substring(indexShorter, indexShorter + length)
|
||||
}
|
||||
.toSet
|
||||
)
|
||||
else None
|
||||
}
|
||||
else None
|
||||
|
||||
println(longestCommonSubstringsOptimizedReferentiallyTransparentFP("thisisatest", "testing123testing"))
|
||||
Loading…
Add table
Add a link
Reference in a new issue