Compress String by Character Count
Compress string by character count
import scala.annotation.tailrec
// compress to list of tuples
def compress(str: String):List[(Char, Int)] = str match {
case "" => Nil
case _ => {
val (x,xs) = str span (c => c == str.head)
(str.head, x.length) :: compress(xs)
}
}
// compress to string
def compressString(str: String):String = {
val sb = new StringBuilder
@tailrec def compress(s: String):Unit = {
if (!s.isEmpty) {
val (x,xs) = s span (c => c == s.head)
sb.append(s.head)
sb.append(x.length.toString)
compress(xs)
}
}
compress(str)
sb.toString
}
// compress in-place using char array
def compressInPlace(ch: Array[Char]):Unit = {
var prev = ch.head
var count = 1
var write = 0
for (c <- ch.tail) {
c match {
case c if c == prev => count += 1
case _ => {
ch(write) = prev
if (count > 1) {
for (j <- count.toString) {
ch(write+1) = j
write += 1
}
}
write += 1
count = 1
prev = c
}
}
}
ch(write) = prev
if (count > 1) ch(write+1) = count.toChar
ch(write+1) = '\0'
}
// initialize string
val s = "aabccccccccccccccccccccccccccccccccccccccccccaaad"
compress(s)
compressString(s)
val ch = Array.fill(50){' '}
for (i <- 0 until s.length) {
ch(i) = s(i)
}
compressInPlace(ch)
ch.mkString("").substring(0,ch.indexOf('\0'))
Last updated