python 正则表达式判断字符串是否为回文_【前端学算法】验证回文字符串

原标题:【前端学算法】验证回文字符串

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

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

示例1:

输入: "A man, a plan, a cancal: Panama"

输出: true

示例2:

输入: "race a car"

输出: false

方法一

思路

首先,去除字符串中的非字母和数字,再将字符串转换为数组,再对数组首尾一一比较,即可得出结果。

详解

将传入的字符串,利用toLowerCase方法统一转化为小写,再利用正则表达式/[^A-Za-z0-9]/g在字符串中去除非字母和数字,最后将字符串转换为数组。

转换数组后,利用循环一一比较元素,先比较第一个和最后一个,再比较第二个和倒数第二个,依次类推,若中间有不相等则不是回文串,反之,则是回文串。

代码

constisPalindrome = ( s) =>{

// 将传入的字符串,统一转化为小写,同时去除非字母和数字,再转换为数组

constarr = s.toLowerCase.replace( /[^A-Za-z0-9]/g, '').split( '');

leti = 0;

letj = arr.length - 1;

// 循环比较元素

while(i < j) {

// 从首尾开始,一一比较元素是否相等

if(arr[i] === arr[j]) {

// 若相等,则第二个元素和倒数第二个元素继续比较,依次类推

i += 1;

j -= 1;

} else{

// 只要有一个相对位置上不相等,既不是回文串

returnfalse;

}

}

// 是回文串

returntrue;

}

时间复杂度:O(n)。该解法中while循环最多执行n / 2次,即回文时,因此,时间复杂度为O(n)。

空间复杂度:O(n)。该解法中,申请了1个大小为n的数组空间,因此,空间复杂度为O(n)。

方法二

思路

首先,去除字符串中的非字母和数字,然后,利用数组将字符串翻转,再和原字符串进行比较,即可得到结果。

详解

将传入的字符串,利用toLowerCase方法统一转化为小写,再利用正则表达式/[^A-Za-z0-9]/g在字符串中去除非字母和数字,得到字符串arr。

将字符串arr转换为数组,利用数组的方法反转数组,再将数组转为字符串newArr。

将字符串arr和字符串newArr进行比较,相等即为回文串,不相等则不为回文串。

代码

constisPalindrome = ( s) =>{

// 为方便比较,统一转化为小写,并去除非字母和数字

constarr = s.toLowerCase.replace( /[^A-Za-z0-9]/g, '');

// 将新字符串转换为数组,利用数组的方法获得反转的字符串

constnewArr = arr.split( '').reverse.join( '');

// 将2个字符进行比较得出结果

returnarr === newArr;

}

时间复杂度:O(n)。该解法中,toLowerCase,replace,split,reverse,join的时间复杂度都为O(n),且都在独立的循环中执行,因此,总的时间复杂度依然为O(n)。

空间复杂度:O(n)。该解法中,申请了1个大小为n的字符串和1个大小为n的数组空间,因此,空间复杂度为O(n * 2),即O(n)。

参考资料

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值