查找字符串中字符之间的长度

时间:2016-01-15 01:14:10

标签: arrays string algorithm scala line

我有一个从字符和字符串到整数数组的函数。数组的索引是字符在文本中显示的次数,该索引的条目是与文本中显示的前一个字符的距离。如果该字符是换行符,则此函数基本上计算给定字符串的行长度数组。

val func: Char => (String => Array[Int]) = (ch: Char) => (str: String) => {
    var lens: Array[Int] = new Array[Int](20)
    var noCh: Int = 0
    var c: Int = 0 // accumlates till the next character is spotted
    for (i <- 0 until str.length) {
        c += 1
        if (str.charAt(i) == ch) {
            if (noCh>= lens.length) {
                val newlen: Array[Int] = new Array[Int](2*noCh)
                Array.copy(lens,0,newlen,0,noCh)
                lens = newlen
            }
            lens(noCh) = c; c = 0; noCh+= 1
        }
    }
    lens
    }                                         //> func  : Char => (String => Array[Int]) = <function1>
    func('\n')("hello world \n hello wstsadfasdf \n sdlfkjasdf\n")
                                                  //> res2: Array[Int] = Array(13, 20, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                                                  //| 0, 0, 0, 0)

有没有更快的方法来解决这个问题?迭代每个角色似乎都很慢,特别是如果你经历一个非常大的字符串。

2 个答案:

答案 0 :(得分:1)

该方法如何运作?通过神奇地预测下一个角色的位置?您可以构建有序集的映射以加速查询。但构建时间仍然是O(n)。但查询可以在O(1)执行。

答案 1 :(得分:1)

正如其他人所说,需要扫描字符串。你怎么能找到ch的出现?但是你肯定会把天气变得很恶劣,因为它是一个单行的:

def func(ch:Char)(str:String):Array[Int] =
 str.foldLeft(List(1)){(a,c)=>if(c!=ch) a.head+1::a.tail else 1::a}.tail.reverse.toArray

func('\n')("hello world \n hello wstsadfasdf \n sdlfkjasdf\n")
//> res0: Array[Int] = Array(13, 20, 12)

或者(更简单,虽然创建一个字符串数组可能效率稍差)

def func2(ch:Char)(str:String):Array[Int] = str.split(ch).map(_.length+1)