上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

最长公共前缀

[复制链接]
  • TA的每日心情
    无聊
    2023-11-2 17:37
  • 签到天数: 275 天

    [LV.8]以坛为家I

    113

    主题

    451

    回帖

    970

    积分

    荣誉开发者

    积分
    970

    荣誉开发者油中2周年卓越贡献生态建设者

    发表于 2022-11-13 13:56:28 | 显示全部楼层 | 阅读模式

    本帖最后由 wwwwwllllk 于 2022-11-13 17:01 编辑

    这篇文章本来是为了最长公共前缀解决问题遇到的情况,但是提交的代码发现自己题意理解错了。前缀就是从头开始就叫前缀,这样一下就排除了好多情况。
    https://bbs.tampermonkey.net.cn/thread-3616-1-1.html

    下面的代码通过了,但是肯定是可以优化的,但是今天早上提了不下10次了,实在不想改了。但是思路是没问题的。哥哥们有好的思路可以评论下面说一下,dd学习一下.

    var longestCommonPrefix = function(strs) {
      // 最上面直接考虑一下数组中只有一个元素的情况吧
      if(strs.length == 1) {
        return strs[0]
      }
    
      // 获取最小值有多少个连续的组合
      function getMinValueCollection(str){
        let left = 0
        let right = 1
        // 计算执行了几个来回,刚开始是0来回
        let count = 0
        // 01 12 23  02 13 03
        let list = []
    
        while(count !== str.length) {
          if(right == str.length) {
            count += 1
            list.push(str.slice(left,right))
            left = 0 
            right = 1 + count
          } else {
            list.push(str.slice(left,right))
            left++
            right++
          }
        }
        // 使用new Set去重
        list = new Set(list)
        return list
      }
      // 找出最小的字符串
      let minValue = null
      // 公共的值的组合
      let commonList = {}
      strs.map((item,index) => {
        if(minValue && minValue.length < item.length){
    
        }else {
            minValue = item 
        }
      })
      let minValueCollection = getMinValueCollection(minValue)
      debugger
      // 把最小的字符串过滤出来
      newStrs = strs.filter((item) => item!== minValue)
      // 为了解决["flower","flower","flower","flower"] 这种情况
      if(strs.length > 0 && newStrs.length == 0) {
        return strs[0]
      }
    
      for(let val of minValueCollection) {
        newStrs.map((item) => {
          // 这样写直接就是前缀的情况下进行的操作["abca","aba","aaab"]解决这个问题
          if(item.indexOf(val) == 0){
            // 加这个if是为了防止出现["dog","racecar","car"],如果有一个元素都有的时候我们应该设置为false
            if(commonList[val] == false) {
    
            } else {
              commonList[val] = true
            }
    
          } else {
            commonList[val] = false
          }
        })
      }
      if(JSON.stringify(commonList) == '{}') {
        return ''
      } else {
        // 过滤出为true的
        let result = []
            result = Object.entries(commonList).filter(item =>  item[1] )
        console.log(result)
        // 最长前缀
        let maxQianZhui = ''
        result.map((item) => {
          // 这里就需要判断是不是公共前缀了
          strs.map((item1) => {
            if(item1.indexOf(item[0]) !== 0){
    
            } else {
              if(item[0].length > maxQianZhui.length) {
                maxQianZhui = item[0]
              }
            }
          })
    
        })
        console.log('maxQianZhui',maxQianZhui)
        // 判断是不是公共前缀(这里也得加一下)
        // 前缀没理解到位,写复杂了,但是不想改了,我最后for循环判断一下了
        strs.map((item) => {
          if(item.indexOf(maxQianZhui) !== 0){
            maxQianZhui = ''
          }
        })
    
        return maxQianZhui
      }
    };
    console.log(longestCommonPrefix(["abca","aba","aaab"]))
    接脚本定制
    I frequently record, because want to leave something.
  • TA的每日心情
    慵懒
    昨天 19:24
  • 签到天数: 631 天

    [LV.9]以坛为家II

    30

    主题

    535

    回帖

    1406

    积分

    荣誉开发者

    积分
    1406

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 2022-11-13 14:31:01 | 显示全部楼层
    本帖最后由 steven026 于 2022-11-13 14:33 编辑

    如果只是为了找最长公共前缀,为什么要写的那么复杂
    先把数组按长度排序,找出最短的字符串,然后遍历最短字符串的所有前缀,如果每个数组元素都以这个前缀开头说明这个就是公共前缀
    1. function longestCommonPrefix(arr) {
    2.     if (arr.length < 2) return
    3.     let shortest = arr.sort((a, b) => a.length - b.length)[0]
    4.     let result = null
    5.     for (let i = 1; i < shortest.length; i++) {
    6.         const prefix = shortest.slice(0, i)
    7.         if (arr.findIndex(item => !item.startsWith(prefix)) > -1) break
    8.         result = prefix
    9.     }
    10.     return result
    11. }
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-2 17:37
  • 签到天数: 275 天

    [LV.8]以坛为家I

    113

    主题

    451

    回帖

    970

    积分

    荣誉开发者

    积分
    970

    荣誉开发者油中2周年卓越贡献生态建设者

    发表于 2022-11-13 14:37:13 | 显示全部楼层
    steven026 发表于 2022-11-13 14:31
    如果只是为了找最长公共前缀,为什么要写的那么复杂
    先把数组按长度排序,找出最短的字符串,然后遍历最短 ...

    确实,刚开始漏掉了前缀的理解了。
    接脚本定制
    I frequently record, because want to leave something.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    293

    主题

    3900

    回帖

    3820

    积分

    管理员

    积分
    3820

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-11-13 16:41:51 | 显示全部楼层
    哥哥开始搞算法了?
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-2 17:37
  • 签到天数: 275 天

    [LV.8]以坛为家I

    113

    主题

    451

    回帖

    970

    积分

    荣誉开发者

    积分
    970

    荣誉开发者油中2周年卓越贡献生态建设者

    发表于 2022-11-13 17:04:51 | 显示全部楼层
    王一之 发表于 2022-11-13 16:41
    哥哥开始搞算法了?

    没办法,小公司面试都要考算法了
    接脚本定制
    I frequently record, because want to leave something.
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表