给定一个输入的字符串,在字符串中找到有多少个不相同序列的“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));
  }
}

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐