fe-interview
fe-interview copied to clipboard
[js] 第30天 写一个方法判断字符串是否为回文字符串
第30天 写一个方法判断字符串是否为回文字符串
https://leetcode-cn.com/problems/valid-palindrome/
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true 示例 2:
输入: "race a car" 输出: false
大概步骤:
- 获取有效的字符串,我们利用正则去匹配字母和数字,因为忽略大小写,所以我们转成小写
- 然后利用 split('') 把字符串分割成数组,再用数组的 reverse() 去反转,再用 join(‘’) 去拼接
- 最后进行比较
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
if (s.length === 1) return true
const str = s.replace(/[^a-zA-Z0-9]/g, "").toLowerCase()
const strReverse = str.split('').reverse().join('')
return str === strReverse
};
function cheackstr(str){ var reversestr=str.split("").reverse().join(""); if(str===reversestr){ alert("我是回文字符串"); }else{ alert("我不是回文字符串") } }
function cheackstr(str){
var reversestr=str.split("").reverse().join("");
if(str===reversestr){
alert("我是回文字符串");
}else{
alert("我不是回文字符串")
}
}
const isPalindrome = (str) =>
str ===
str
.split("")
.reverse()
.join("");
console.log(isPalindrome("abc"));
console.log(isPalindrome("abcdcba"));
console.log(isPalindrome("abccba"));
console.log(isPalindrome("abccbaabc"));
function cheackstr(str){
var reversestr=str.split("").reverse().join("");
if(str===reversestr){
alert("我是回文字符串");
}else{
alert("我不是回文字符串")
}
}
function isPalindrome(str) {
let lp = 0,
rp = str.length - 1;
while (lp <= rp) {
if (str[lp++] != str[rp--]) return false;
}
return true;
}
function isPalindrome(str) { let lp = 0, rp = str.length - 1; while (lp <= rp) { if (str[lp++] != str[rp--]) return false; } return true; }
双指针从头尾往中间遍历,这个效率比前面的回答高多了
function isPalindrome(str) { let lp = 0, rp = str.length - 1; while (lp <= rp) { if (str[lp++] != str[rp--]) return false; } return true; }双指针从头尾往中间遍历,这个效率比前面的回答高多了
没有考虑无效字符以及大小写,不过双指针还是高效。
const fn = (str) => {
str = str.replace(/(\W+)|(\_+)/g, '');
let newStr = str.split('').reverse().join('');
if (str === newStr) {
return true;
}
return false;
}
const check = s => { return s === s.split('').reverse().join(''); }
console.log(check('aba'));
function isPalindrome (st){
let tem = st.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()
return tem == tem.split('').reverse().join('')
}
把上边各位的答案做了一下总结
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true 示例 2:
输入: "race a car" 输出: false
这个题的关键点在于判断字符串(长度为n)的第i个字符和第(n - 1) - i字符是否相等
'1 2 3 4 3 2 1 ' => length -> 7
0 1 2 3 4 5 6
str[0] == str[6]
str[1] == str[5]
str[2] == str[4]
方法一
使用for循环进行遍历
/**
* @description: 判断字符串是否是回文字符串
* @param {string} str
* @return {boolean}
*/
function isPalindrome(str) {
if (str.length === 1) return true;
str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
for (let i = 0; i < str.length; i++) {
if (str[i] != str[str.length - 1 - i]) {
return false;
}
}
return true;
}
方法二
通过数组反转字符,然后再和原字符串进行比较
/**
* @description: 判断字符串是否是回文字符串
* @param {string} str
* @return {boolean}
*/
function isPalindrome(str) {
if (str.length === 1) return true;
str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
const strReverse = str.split('').reverse().join('');
return str == strReverse;
}
方法三
双指针遍历,从两边向中间进行遍历。其实和第一种方法中的for循环中if语句的判断条件类似
function isPalindrome(str) {
if (str.length === 1) return true;
str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
let lp = 0,
rp = str.length - 1;
while (lp <= rp) {
// 这里lp再进行str[lp]运算,然后再自增
if (str[lp++] != str[rp--]) {
return false;
}
}
return true;
}
function judgeStr(s) {
let str = s.toLocaleLowerCase().replace(/[^a-zA-Z0-9]/g,'')
let strRe = str.split('').reverse().join('');
return str === strRe;
}
/**
- @param {string} s
- @return {boolean} */ var isPalindrome = function(s) { if (s.length === 1) return true const str = s.replace(/[^a-zA-Z0-9]/g, "").toLowerCase() const strReverse = str.split('').reverse().join('') return str === strReverse };
function cheackstr(str) { str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase() if (str == [...str].reverse().join('')) { return true } else { return false } }
function isPalindrome(str) {
const rts = str.split('').reverse().join('');
return rts === str;
}
var str = '锵咚锵';
function isPalindrome(data) { if (data.length === 1) return true; let str1 = data.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(); let str2 = str1.split('').reverse().join(''); return str1 === str2 } console.log(isPalindrome(str));
// 判断是否为回文字符串 var str8 = 'KabcdDcBak' function isPalindrome(str) { // 转成小写 str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(); // 第一种 // let str1 = str.split('').reverse().join('') // return str === str1
// 第二种 双指针遍历
let arr = str.split('')
let i = 0, k = str.length -1
while(i<k) {
if (arr[i++] != arr[k--]) {
return false
}
}
return true
}
console.log(isPalindrome(str8))
let str = 'abcdcba';
isOk = true;
for (let i = 0; i < str.length; i++) {
if (i > str.length / 2) {
break;
}
if (str[i] !== str[str.length - 1 - i]) {
isOk = false;
}
}
console.log(isOk);
function isPalindrome(str){
is(str.length === 1) return true;
str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
for(let i = 0; i < str.length; i++){
if(str[i] !== str[str.length - 1 - i]){
return fasle;
}
}
return true;
}
function isPalindrome(str){
is(str.length === 1) return true;
str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
let newStr = str.split('').reverse().join('');
return str === newStr;
}
function isPalindrome(str){
is(str.length === 1) return true;
str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
let lp = 0,
rp = str.length -1;
while(lp <= rp){
if(str[lp++] !== str[rp--]){
return false;
}
}
return true;
}