给定一个输入的字符串,在字符串中找到有多少个不相同序列的“iflytek”,其中“i”,“f”,"l","y","t","e","k"必须按照前后顺序排序,但不要求是连续的。例如:“iafeelytek”中也存在一个“ixfxxlytek”的序列,可以认为是找到1个“iflytek”,又如“iflyttek”存在“iflytxek”和“iflyxtek”两个不同序列的“iflytek”,查找过程中大小写不敏感,字符串长度小于10000。
输入 | 输出 |
"iflytekiflytek" | 8 |
"iflylytfetkeefek" | 24 |
"iflytek's voice technology ranks first in the word" | 5 |
思路
在字符串任意一个位置,如果是”k“,则它之前的字串中”iflytek“的个数等于”iflyte“的个数。依此类推”iflyte“的个数可由”iflyt“个数算得。所以我们用一个数组来记录以下这些子串的累计个数。
"i", "if", "ifl", "ifly", "iflyt", "iflyte", "iflytek"
遍历字符串并更新该数组,最后”iflytek“的累加值就是答案。
object Solution {
def findIflytek(str: String):Int = {
val nsbInit = List.fill(7)(0) // num of substring {i, if, ifl, ...}
str.foldLeft(nsbInit){(nsb, c) =>
"iflytek".indexOf(c.toLower) match {
case -1 => nsb
case 0 => nsb.updated(0, nsb.head + 1)
case i => nsb.updated(i, nsb(i) + nsb(i-1))
}
}.last
}
def main(args:Array[String]): Unit = {
val s0 = "iflytekiflytek";
val s1 = "iflylytfetkeefek";
val s2 = "iflytek's voice technology ranks first in the word";
println(findIflytek(s0));
println(findIflytek(s1));
println(findIflytek(s2));
}
}