原标题:【前端学算法】验证回文字符串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例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)。