题解 | #字符串通配符#

字符串通配符

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])  
})


全部评论

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
09-16 17:32
门头沟学院 Java
顺顺超爱学:1.熟悉Java编程语言,熟悉集合,多线程,IO,反射等核心知识,了解线程池,ThreadLocal等进阶知识; 2.熟悉Mysql数据库,熟练使用sql,熟悉索引,存储引擎,事务原理,MVCC,锁机制,了解sql优化; 3.熟悉Redis缓存,了解常见的数据类型,了解缓存常见问题及其解决方案,了解使用Redis实现的分布式锁方案; 4.熟悉Javaweb开发框架,熟悉spring,springmvc,mybatis等,了解IOC,AOP等; 5.熟悉微服务开发框架,熟悉SpringBoot,SpringCloud,包括Nacos,OpenFeign,Gateway等核心组件; 6.熟悉Rabbitmq消息队列,熟练使用消息模型,了解架构,消息可靠性,死信队列,延迟消息等;
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务