2017-11-21 14 views
1

문자열의 시퀀스를 읽고 문자열의 공통 줄기를 반환 할 수 있기를 원합니다. 예를 들어 다음 시퀀스가있는 경우 :재귀 적으로 문자열 시퀀스의 공통 루트를 찾는 방법은 무엇입니까?

val testSeq: Seq[String] = Seq("RootA_", "RootB_", "RootC_") 

그런 다음 "Root"문자열 만 반환해야합니다.

내 현재 함수는 다음과 같습니다. 그러나 intersect를 사용하면 원하지 않는 "_"이 루트의 일부로 반환됩니다 (즉, "Root_"). takeWhile을 사용해 보았지만 실패했습니다.

def findRoot(ss: Seq[String], root: String): String = ss match { 
    case h :: Nil => h.intersect(root) 
    case h :: t => findRoot(t, h.intersect(t.head)) 
} 

스칼라 방법이 내장되어있는 경우 알려 주시기 바랍니다. 그렇지 않으면 누군가가이 문제를 해결할 때 균열이 있기를 원한다면 많은 도움이 될 것입니다!

답변

0

내가 아는 한, 두 문자열의 공통 접두어를 반환하는 scala stdlib 함수는 없습니다.

당신은 ziptakeWhile

def findRoot(seq: Seq[String]): String = {        

    def prefix(a: String, b: String) = a       
     .zip(b)       
     .takeWhile { case (a, b) => a == b } 
     .map(_._1) 
     .mkString             

    @tailrec              
    def find(ss: Seq[String], root: String): String = ss match { 
     case h :: Nil => prefix(h, root)       
     case h :: t => find(t, prefix(h, root))     
    }                

    find(seq.tail, seq.head)          

}                 
를 사용하여 공통의 접두사를 계산할 수 있습니다