算法练习-驼峰式匹配

题目描述:(题目来源:LeetCode)

如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。)

给定待查询列表 queries,和模式串 pattern,返回由布尔值组成的答案列表 answer。只有在待查项 queries[i] 与模式串 pattern 匹配时, answer[i] 才为 true,否则为 false。

示例 1:

输入:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FB"
输出:[true,false,true,true,false]
示例:
"FooBar" 可以这样生成:"F" + "oo" + "B" + "ar"。
"FootBall" 可以这样生成:"F" + "oot" + "B" + "all".
"FrameBuffer" 可以这样生成:"F" + "rame" + "B" + "uffer".

示例 2:

输入:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FoBa"
输出:[true,false,true,false,false]
解释:
"FooBar" 可以这样生成:"Fo" + "o" + "Ba" + "r".
"FootBall" 可以这样生成:"Fo" + "ot" + "Ba" + "ll".

示例 3:

输出:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FoBaT"
输入:[false,true,false,false,false]
解释: 
"FooBarTest" 可以这样生成:"Fo" + "o" + "Ba" + "r" + "T" + "est".

语言:Kotlin

解题思路:看到这个题目时,觉得这个题目的思路其实挺简单的,只需要将一个大字符串分解成多个小字符串,然后再判断每个小字符串中是否含有大写字母。但是在真正写的过程中,还是有些小细节需要注意,具体看代码吧,这个题目只需要细心就好了

class Solution {
    fun camelMatch(queries: Array<String>, pattern: String): List<Boolean> {
        val list = mutableListOf<Boolean>()
        for (que in queries){
            list.add(computer(que,pattern))
        }
        return list
    }
    private fun computer(query:String,pattern: String) : Boolean{
        val list = mutableListOf<Int>()
        for (pa in pattern){
            if (list.size == 0){
                if (pomputer2(query,pa.toString()) != -1) {
                    list.add(pomputer2(query, pa.toString()))
                }else{
                    return false
                }
            }else if (list[list.lastIndex] != query.lastIndex){
                if (pomputer2(query.substring(list[list.lastIndex]+1),pa.toString()) != -1) {
                    list.add(
                        pomputer2(
                            query.substring(list[list.lastIndex] + 1),
                            pa.toString()
                        ) + list[list.lastIndex] + 1
                    )
                }else{
                    return false
                }
            }
        }
        for (i in 0..list.lastIndex){
            if (list[i] != 0){
                if (i == 0){
                    for (j in query.substring(0,list[0])){
                        if (j in 'A'..'Z'){
                            return false
                        }
                    }
                }else{
                    if (list[i-1]+1 != list[i]) {
                        for (j in query.substring(list[i - 1] + 1, list[i])){
                            if (j in 'A'..'Z'){
                                return false
                            }
                        }
                    }
                }
                if (i == list.lastIndex&&list[i]!=query.lastIndex){
                    for (j in query.substring(list[i]+1)){
                        if (j in 'A'..'Z'){
                            return false
                        }
                    }
                }
            }
        }
        return true
    }
    private fun pomputer2(query: String,pattern: String) :Int{
        return query.indexOf(pattern)
    }
}
fun main(){
    println("${Solution().camelMatch(arrayOf("FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"),"FoBaT")}")
}//输出为[false, true, false, false, false]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值