题解 | #字符串通配符#

字符串通配符

https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036

三种思路
1. 递归,我试了会超时,不知道什么原因
2. 正则,题目没限制,应该也可以
3. 动态规划
const readline = require('readline');
 
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
let count = 1
let s1, s2
rl.on('line', function (line) {
    if (count == 1) {
        s1 = line.trim()
    } else {
        s2 = line.trim()
    }
    count++
});

rl.on('close', function () {

// 递归
//     const dfs = (rule, target) => {
//         if (rule == '' && target == '') return true
//         else if (rule == '' && target !== '') return false
//         else if (rule !== '' && target == '') return (rule.replace('*', '') == '')
//         else {
//             let match = false 
//             match = (rule[0] == '?' && /\w/.test(target[0])) || rule[0].toLowerCase() == target[0].toLowerCase()
//             if (rule[0] == '*') {
//                 // 匹配 0 个 或者 匹配多个
//                 return dfs(rule.slice(1), target) || dfs(rule, target.slice(1))
//             } else {
//                 return match &&  (dfs(rule.slice(1), target.slice(1)))
//             }
            
//         } 
//     }
//     console.log(dfs(s1, s2))        // 正则
//     s1 = s1.replace(/\?/g, '[a-z0-9]').replace(/\*/g, '.*')
//     console.log(new RegExp('^' + s1 + '$', 'i').test(s2))

 //动态规划
    let len1 = s1.length
    let len2 = s2.length
    let dp = new Array(len1+1).fill(0).map(_ => new Array(len2+1).fill(false))
    dp[0][0] = true
    
    if (s1[0] == "*") {
        dp[1][0] = true
    }
    
    for (let i = 1; i <= len1; i++) {
        for (let j = 1; j <= len2; j++) {
            if (s1[i-1] == '?' && /[a-z0-9]/i.test(s2[j-1])) {
                dp[i][j] = dp[i-1][j-1]
            } 
            else if (s1[i-1] == "*") {
                dp[i][j] = dp[i-1][j] || dp[i-1][j-1] || dp[i][j-1]
            }
            else {
                dp[i][j] = dp[i-1][j-1] && s1[i-1].toLowerCase() == s2[j-1].toLowerCase() 
            }
        }
    }
    console.log(dp[len1][len2])  
})


全部评论

相关推荐

一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务