LeetCode - 125 - 验证回文串(valid-palindrome)

栏目: IT技术 · 发布时间: 5年前

内容简介:LeetCode - 125 - 验证回文串(valid-palindrome)

Create by jsliang on 2019-7-2 07:50:41
Recently revised in 2019-7-2 08:57:36

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | |  3.1 解法 - 暴力破解 | |  3.2 解法 - 双指针 |

二 前言

  • 难度:简单

  • 涉及知识:双指针、字符串

  • 题目地址:https://leetcode-cn.com/problems/valid-palindrome/

  • 题目内容

  1. 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

  2. 说明:本题中,我们将空字符串定义为有效的回文串。

  3. 示例 1:

  4. 输入: "A man, a plan, a canal: Panama"

  5. 输出: true

  6. 示例 2:

  7. 输入: "race a car"

  8. 输出: false

三 解题

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

3.1 解法 - 暴力破解

  • 解题代码

  1. var isPalindrome = function(s) {

  2. s = s.replace(/[^0-9a-zA-Z]/g, '').toLocaleLowerCase();

  3. let reverse = s.split('').reverse().join('');

  4. return s === reverse;

  5. };

  • 执行测试

  1. s: A man,a plan,a canal:Panama

  2. return: true

  • LeetCode Submit

  1. Accepted

  2. 476/476 cases passed (96 ms)

  3. Your runtime beats 95.55 % of javascript submissions

  4. Your memory usage beats 42.1 % of javascript submissions (38.3 MB)

  • 知识点

  1. replace(): replace()方法返回一个由替换值(replacement)替换一些或所有匹配的模式(pattern)后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。 replace() 详细介绍

  2. toLocaleLowerCase(): toLocaleLowerCase()方法根据任何特定于语言环境的案例映射,返回调用字符串值转换为小写的值。。 toLocaleLowerCase() 详细介绍

  3. split(): split() 方法使用指定的分隔符字符串将一个 String 对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。 split() 详细介绍

  4. reverse(): reverse() 方法将数组中元素的位置颠倒,并返回该数组。该方法会改变原数组。 reverse() 详细介绍

  5. join(): join() 方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。 join() 详细介绍

  • 解题思路

暴力破解,无疑是最不耗脑力的,你只需要知道几个 JS 的 API 即可:

首先,规整字符串:

s=s.replace(/[^0-9a-zA-Z]/g,'').toLocaleLowerCase();

  • replace():将 s 中非大小写字符或者数字的内容替换掉。

  • toLocaleLowerCase:将字符串转成小写。

此时, s=amanaplanacanalpanama

然后,将字符串转成数组,调用数组的 reverse(),再将数组换成字符串:

letreverse=s.split('').reverse().join('');

  • split():将字符串转成数组

  • reverse():反转数组

  • join():将数组转成字符串

最后,判断下 s===reversereturn 这个结果值即可。

3.2 解法 - 双指针

  • 解题代码

  1. var isPalindrome = function(s) {

  2. s = s.replace(/[^0-9a-zA-Z]/g, "").toLocaleLowerCase();

  3. for (let i = 0; i < s.length / 2; i++) {

  4. if (s[i] !== s[s.length - 1 - i]) {

  5. return false;

  6. }

  7. }

  8. return true;

  9. };

  • 执行测试

  1. s: A man,a plan,a canal:Panama

  2. return: true

  • LeetCode Submit

  1. Accepted

  2. 476/476 cases passed (92 ms)

  3. Your runtime beats 97.57 % of javascript submissions

  4. Your memory usage beats 75.72 % of javascript submissions (37.1 MB)

  • 解题思路

首先,国际惯例去掉非大小写字符或者数字的字符串,并将字符串转换成小写。

然后,我们对字符串进行一个遍历(有的小伙伴可能不知道,JS 字符串也可以通过 for 遍历,但是听说字符串的遍历会比数组的遍历消耗多点)。

由于是判断回文,所以我们只需要循环一半即可(如果长度为 3/5/7 等奇数值,忽略中间那个字符串,例如 abcba,忽略 c 也是可行的)。

  1. if (s[i] !== s[s.length - 1 - i]) {

  2. return false;

  3. }

最后,我们通过双指针的移动:

01234 a b c b a

  • 0 对应着 length - 1 - 0 = 4

  • 1 对应着 length - 1 - 1 = 3

  • 2 对应着 length - 1 - 2 = 2

这样,当它们对应的数字不同时,返回 false;否则返回 true


不折腾的前端,和咸鱼有什么区别!

LeetCode - 125 - 验证回文串(valid-palindrome)

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

LeetCode - 125 - 验证回文串(valid-palindrome)
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。


以上所述就是小编给大家介绍的《LeetCode - 125 - 验证回文串(valid-palindrome)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

你不知道的JavaScript(上卷)

你不知道的JavaScript(上卷)

[美] Kyle Simpson / 赵望野、梁杰 / 人民邮电出版社 / 2015-4 / 49.00元

JavaScript语言有很多复杂的概念,但却用简单的方式体现出来(比如回调函数),因此,JavaScript开发者无需理解语言内部的原理,就能编写出功能全面的程序;就像收音机一样,你无需理解里面的管子和线圈都是做什么用的,只要会操作收音机上的按键,就可以收听你喜欢的节目。然而,JavaScript的这些复杂精妙的概念才是语言的精髓,即使是经验丰富的JavaScript开发者,如果没有认真学习也无......一起来看看 《你不知道的JavaScript(上卷)》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具