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

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

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

示例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)。