leetCode算法第三天

news2024/11/15 5:36:31

继续练习leetcode中关于字符串的算法题,越练越觉得自己编码思想还很欠缺,继续努力。

文章目录

    • 有效的括号
    • 括号生成
    • 串联所有单词的子串
    • 最长有效括号

在这里插入图片描述

有效的括号

leetcode链接:https://leetcode.cn/problems/valid-parentheses/

解题思路:无论这三种符号谁在里谁在外,或者单独存在,只要是有效的括号,我们都可以通过将字符串中()或者[]或者{}替换成"",下一次循环替换时,外层的括号也会被替换,直到最外层。

理论上最多需要替换字符串长度的二分之一,因为括号总是成对出现,如果一直到最后都没能将字符串彻底清空,表明有不成对的括号出现,即不是有效的括号。

/** https://leetcode.cn/problems/valid-parentheses/
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
  // 先判断是否是偶数个
  if (typeof s !== "string" || s.length % 2) {
    return false;
  }

  const length = s.length;

  for (let i = 0; i <= length / 2; i++) {
    s = s.replace("()", "").replace("[]", "").replace("{}", "");

    if (s.length === 0) {
      break;
    }
  }

  return s.length === 0;
};

括号生成

leetcode 链接:https://leetcode.cn/problems/generate-parentheses/

解题思路:要生成n对()的字符串,就意味着要递归n次,每一次又要在之前的字符串的每一个位置尝试着添加,循环上一次结果的长度次数。

比如当n为3时,需要递归三次,第一次就是一个"()“,第二次就在第一次的基础上,分别从0的位置一直到最后的位置尝试加”()“,所以第二次可能是”()()“,”(())“,”()()",然后发现1和3相同,所以只保存一个,将第二次循环的每一个不重复的结果进行第三次递归。

所以,我们n的数,其实就是递归的次数,每一次递归里面都需要循环,循环的次数就是上一次递归结果的长度。

/** https://leetcode.cn/problems/generate-parentheses/
 * @param {number} n
 * @return {string[]}
 */
var generateParenthesis = function (n) {
  const result = [];

  if (typeof n !== "number" || n <= 0) {
    return result;
  }

  let otherStr = [];

  const generateString = function (n, s) {
    for (let i = 0; i <= s.length; i++) {
      // 在s的每一个位置分别插入()
      let newStr = s.slice(0, i) + "()" + s.slice(i);

      if (n === newStr.length / 2) {
        // 最后要检查一下result中是否已经有了该字符串,可能出现重复的情况,比如将()放在 0和最后的位置,对于 "()"来说是一样的
        if (!result.includes(newStr)) {
          result.push(newStr);
        }
      } else {
        if (!otherStr.includes(newStr)) {
          // 如果otherStr中已经出现过,表明之前已经执行了,不需要再放入
          otherStr.push(newStr);
          generateString(n, newStr);
        }
        // generateString(n, newStr)
      }
    }
  };

  generateString(n, "");

  return result;
};

串联所有单词的子串

leetcode 链接:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/

解题思路:先将s按照要求的长度(words里面所有元素加起来的长度)进行切割片段,切割出来的每一个片段进行循环判断,是否是由words里面的元素随机顺序组合出来的。

如何判断?将每一个片段按照words里单个元素的长度再次进行切割,将这些小小的片段去words里面一一匹配,只要全部都能匹配上,就符合要求,否则不符合。并把这些片段在s中的坐标返回即可。

/**
 * @param {string} s https://leetcode.cn/problems/substring-with-concatenation-of-all-words/
 * @param {string[]} words
 * @return {number[]}
 */
var findSubstring = function (s, words) {
  // 先判断一下words的元素的长度和words的长度
  let length = 0;
  let result = [];
  if (words.length) {
    length = words.length * words[0].length;
  }

  const array = [];
  // 将s字符串按照length的长度进行切割,并将所有切割后的内容存放到数组中,必须得保存当前的下标,这个下标需要精准返回。
  for (let i = 0; i <= s.length - length; i++) {
    array.push({ string: s.slice(i, i + length), index: i });
  }

  // 我们需要遍历这个数组,并将里面每一个元素字符串按照words[0].length 的长度切割成一个个小的字符串
  array.forEach((item) => {
    let itemSplitArray = [];
    let i = 0;
    while (i < item.string.length) {
      itemSplitArray.push(item.string.slice(i, i + words[0].length));
      i = i + words[0].length;
    }

    // 切割出来的这个itemSplitArray的元素需要去words中进行匹配,以确保每一个元素都在words中能够找到,并且不是重复的。
    let newWords = JSON.parse(JSON.stringify(words));
    let isSuccess = true;

    for (const split of itemSplitArray) {
      let index = newWords.findIndex((findItem) => {
        return split === findItem;
      });

      if (index >= 0) {
        newWords[index] = undefined;
      } else {
        // 只要有一个没找到即index为-1,就认为这个item.string不符合条件,就找下一个。
        isSuccess = false;
        break;
      }
    }

    if (isSuccess) {
      result.push(item.index);
    }
  });

  return result;
};

最长有效括号

leetcode 链接:https://leetcode.cn/problems/longest-valid-parentheses/

这道题我用了两种解法,第一种解法能行得通,容易理解,但是效率很低
甚至不能通过leetcode的效率检测。逻辑和目的实际上没问题。

/** 最长有效括号 https://leetcode.cn/problems/longest-valid-parentheses/
 * @param {string} s
 * @return {number}
 */
var longestValidParentheses = function (s) {
  // 最长有效,我们就从最长开始

  let targetArray = [];

  for (let i = s.length; i >= 2; i--) {
    if (i % 2 !== 0) {
      continue;
    }
    for (let j = 0; j <= s.length - i; j++) {
      let targetStr = s.slice(j, j + i);
      targetArray.push(targetStr);
    }
  }

  // 我们不在双重for循环里判断targetStr是不是符合要求的有效括号,提出来可能判断可能会好一些,数组最前面的item越长,
  // 所以按照数组的顺序,只要判断出当前的item符合要求就直接返回结果,因为剩下的即使符合要求,也比当前的item短
  for (const item of targetArray) {
    let newItem = item;

    // 判断是否是有效括号其实很简单,通过之前的题目,我们知道,将字符串里面的()全部替换成“”,重复数次即可
    for (let n = 0; n <= item.length / 2; n++) {
      newItem = newItem.replace("()", "");

      if (newItem.length === 0) {
        return item.length;
      } else if (newItem.length % 2 !== 0) {
        break;
      }
    }

    if (newItem.length === 0) {
      return item.length;
    }
  }

  // 如果整个targetArray遍历完了都找不到符合要求的,直接返回0
  return 0;
};

第二种解法利用栈stack的思想,遇到"("即入栈,遇到")"即出栈,但对于最长有效长度的认定,的确需要认真思考。

在这里插入图片描述
如果遇到)出栈后还为空,就将当前的下标作为参考值(和最开始的-1一样,都是参考值),存入栈中。
在这里插入图片描述

/** 最长有效括号 https://leetcode.cn/problems/longest-valid-parentheses/
 * @param {string} s
 * @return {number}
 */

var longestValidParentheses = (s) => {
  let maxLen = 0;
  const stack = [];
  stack.push(-1);
  for (let i = 0; i < s.length; i++) {
    const c = s[i];
    if (c == '(') {       // 左括号的索引,入栈
      stack.push(i);
    } else {              // 遍历到右括号
      stack.pop();        // 栈顶的左括号被匹配,出栈
      if (stack.length) { // 栈未空
        const curMaxLen = i - stack[stack.length - 1]; // 计算有效连续长度
        maxLen = Math.max(maxLen, curMaxLen);          // 挑战最大值
      } else {            // 栈空了
        stack.push(i);    // 入栈充当参照
      }
    }
  }
  return maxLen;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/443078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SPI协议

SPI数据接口 SPI&#xff08;Serial Peripheral Interface&#xff09;串行外设接口的简称&#xff0c;它是一种同步全双工通信协议。有 3根或者 4根数据线组成&#xff0c;包括 CLK、SOMI、SIMO、STE&#xff1a; CLK为时钟线&#xff0c;由主机控制输出。 SOMI…

国产数字温度传感芯片M117 Pin to Pin替代PT100和PT1000

高精度数字温度传感芯片 - M117&#xff0c;可Pin to Pin替代PT100/PT1000&#xff0c;且具功能差异化优势&#xff0c;支持行业应用的定制化需求。高测温精度0.1℃&#xff0c;用户无需进行校准。芯片感温原理基于CMOS半导体PN节温度与带隙电压的特性关系&#xff0c;经过小信…

电脑开机进不了系统卡在加载界面怎么办?

电脑开机进不了系统卡在加载界面怎么办&#xff1f;有用户电脑弹出需要进行系统更新&#xff0c;不小心点到了系统更新的选项。因为自己不想进行系统更新&#xff0c;所以马上将电脑关机了。但是关机之后却发现系统一直卡在开机的界面中&#xff0c;无法进入桌面中了。那么这个…

如何在Anaconda下安装pytorch(conda安装和pip安装)

前言 文字说明 本文中标红的&#xff0c;代表的是我认为比较重要的。 版本说明 python环境配置&#xff1a;jupyter的base环境下的python是3.10版本。CUDA配置是&#xff1a;CUDA11.6。目前pytorch官网提示支持的版本是3.7-3.9 本文主要用来记录自己在安装pytorch中…

乙肝80%以上由妈妈传给孩子 5岁以下治愈率超六成

中国是乙肝大国。目前&#xff0c;乙肝病毒感染人数仍超过7000万。通过医务人员多年的努力&#xff0c;母婴传播感染率明显下降。到目前为止&#xff0c;已降至0.3%左右。每年仍有5万名儿童感染乙肝病毒。目前&#xff0c;儿童慢性乙肝仍在180万左右&#xff0c;绝对数仍是世界…

Node【模块系统】

文章目录 &#x1f31f;前言&#x1f31f;Nodejs模块系统&#x1f31f;为什么需要模块化&#x1f31f;什么是Nodejs模块&#x1f31f;Nodejs模块分类&#x1f31f;文件模块的分类&#x1f31f;调用内置模块&#x1f31f;调用文件模块 &#x1f31f;Nodejs模块使用&#x1f31f;…

2023年网络安全的发展趋势是怎样的?

数据安全越来越重要。 我国《数据安全法》提出“建立健全数据安全治理体系”&#xff0c;各地区部门均在探索和简历数据分类分级、重要数据识别与重点保护制度。 数据安全治理不仅是一系列技术应用或产品&#xff0c;更是包括组织构建、规范制定、技术支撑等要素共同完成数据…

PACS/RIS影像管理系统源码,支持图像后处理与重建

PACS/RIS影像管理系统源码&#xff0c;功能强大&#xff0c;文档齐全&#xff0c;有演示。 文末获取联系&#xff01; 系统特点&#xff1a; 符合国内医院影像中心/放射科的典型工作管理流程。 开放式体系结构&#xff0c;完全符合DICOM3.0标准&#xff0c;提供HL7标准接口&a…

MyBatis(十四)MyBatis的逆向工程

前言、 所谓的逆向工程是&#xff1a;根据数据库表逆向生成Java的pojo类&#xff0c;SqlMapper.xml文件&#xff0c;以及Mapper接口类等。 要完成这个工作&#xff0c;需要借助别人写好的逆向工程插件。 思考&#xff1a;使用这个插件的话&#xff0c;需要给这个插件配置哪些…

2023年淮阴工学院五年一贯制专转本退役士兵大学语文考试大纲

2023年淮阴工学院五年一贯制专转本退役士兵大学语文考试大纲 一、考试目标 淮阴工学院五年一贯制高职专转本入学考试秘书学专业《大学语文》考试是我校为招收五年一贯制高职专转本学生设置的具有选拔性质的考试科目。其目的是科学、公平、有效地测试考生是否具备攻读秘书学本…

【论文总结】V-Shuttle:可扩展和语义感知的 Hypervisor 虚拟设备模糊测试

介绍 这是来自2021 CCS的一篇论文&#xff0c;作者有GaoningPan, Xingwei Lin, Xuhong Zhang, Yongkang Jia, Shouling Ji, Chunming Wu, Xinlei Ying, Jiashui Wang, Yanjun Wu。该论文提出V-shuttle的新框架来执行管控程序的模糊测试&#xff0c;该框架执行可扩展和语义感知…

LDR6328 PD诱骗(取电)芯片概述,支持定制化取电

PD充电需要在供电端&#xff08;充电器&#xff09;和受电端&#xff08;产品上&#xff09;都要有协议通信&#xff0c;一般充电器内有PD供电协议芯片&#xff0c;产品上有PD协议受电芯片&#xff0c;两者连接后会进行通信握手&#xff0c;连接成功后充电器才会输出需要的电压…

银行数字化转型导师坚鹏:商业银行对公业务数字化风控

商业银行对公业务数字化风控 课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚商业银行数字化风控发展现状&#xff1f; 不清楚对公业务数字化风控工作如何开展&#xff1f; 不知道零售业务数字化风控工作如何开展&#xff1f; …

探索五大机器学习技术及其应用

没有一种机器学习算法可以解决所有类型的机器学习问题。机器学习任务可能千差万别&#xff0c;算法的选择将取决于数据的大小、维数和稀疏性等因素。目标变量、数据的质量以及特征内部以及特征与目标变量之间存在的相互作用和统计关系。 在本文中&#xff0c;我将提供机器学习…

【NPM】npm上传包

必须使用npm镜像&#xff0c;不能使用淘宝镜像 查看当前的镜像 npm config get registry切换镜像为npm &#xff08;不能使用淘宝镜像&#xff09; npm config set registry https://registry.npmjs.org在要发布的包文件目录执行 发布为公共包 npm publish --access publi…

【基于准交叉双边滤波:医学图像】

Medical image fusion based on quasi-cross bilateral filtering &#xff08;基于准交叉双边滤波的医学图像融合&#xff09; 图像融合技术是利用特定的算法从多幅图像中提取并融合特征&#xff0c;然后将它们组合成一幅图像的方法。然而&#xff0c;目前的图像融合方法大多…

学生管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;​​​​​​​https://download.csdn.net/download/qq_50954361/87700422 …

react-9 函数式写法rsf,配合HOOKS基础钩子函数

函数组件和类组件区别&#xff1a; 1.函数组件中没有this 2.函数组件无需继承 3.函数组件默认没有状态&#xff0c;想要使用组件状态必须通过 HOOK 函数引入 4.函数组件默认没有生命周期函数 5.函数组件的渲染&#xff0c;只需要一次函数调用即可 useState &#xff1a;用…

广联转债上市价格预测

广联转债 基本信息 转债名称&#xff1a;广联转债&#xff0c;评级&#xff1a;A&#xff0c;发行规模&#xff1a;7.0亿元。 正股名称&#xff1a;广联航空&#xff0c;今日收盘价&#xff1a;31.09元&#xff0c;转股价格&#xff1a;32.32元。 当前转股价值 转债面值 / 转股…

软件测试之测试分类

文章目录 按测试对象分界面测试可靠性测试容错性测试文档测试兼容性测试易用性测试安装卸载测试安全测试性能测试内存泄露测试弱网测试 按代码的查看情况黑盒测试白盒测试灰盒测试 按开发阶段单元测试集成测试系统测试回归测试冒烟测试验收测试 测试的大致分类&#xff1a; 下…