js算法题解(第五天)---LeetCode:344.反转字符串和 125. 验证回文串

294 阅读3分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

前言:

每天一道算法题,死磕算法

今天我们来讲字符串,字符串和数组很像,所以对数组掌握好以后,也就能很容易的掌握好字符串的题型了,我们先来一道题热热身

题目

这是leetcode上面的第344道题目,反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

难度:简单

示例 1:

输入: s = ["h","e","l","l","o"]
输出: ["o","l","l","e","h"]

这道题真是太简单,我们就不用分析了,一行代码搞定

/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
var reverseString = function(s) {
    s=s.reverse();
};

既然这么容易搞定,为啥我们还要讲他,其实leetcode上的好多题都是有先后顺序的,只不过他给乱序的排列了,所以我们的任务就是把这些乱序的归归类,每道题以前一道题为基础,所以接下来我们就将一道以反转字符串为基础的题目,回文串

题目:

这是leetcode上的第125道题目验证回文串

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

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

难度:简单

示例 1:

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

输出: true

解释:"amanaplanacanalpanama" 是回文串

咱们科普一下什么是回文串 “回文串”是一个正读和反读都一样的字符串

思路

第一步:从题目中提取关键词

1.可以忽略大小写,所以大小写这一点我们就不用考虑

2.空字符串定义为有效的回文串,所以要判断空字符串

3.“回文串”是一个正读和反读都一样的字符串

第二步: 分析

“回文串”既然是一个正读和反读都一样的字符串,那么证明反转前和反转以后两个字符串是相等的,这是方法一

字符串既然和数组很像,那么是不是也能用双指针法,当然可以啦

  • 1.定义左右指针,while(left<right)
  • 2.每次判断左右指针是否相等,如果相等则left+1,right-1,如果不相等,则返回false 这是方法二

题解

方法一的思路很简单呀,我们先来写方法一

但是因为字符串中除了字符串和字母以外还含有其他字符,所以我们首先处理一下字符串只剩下数字和小写字母

方法一:反转法

/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function(s) {
  // 我们先对字符串进行一下处理,只留下字母和数字
  s = s.replace(/\W/g, "").replace("_", "").toLowerCase();
  return s === s.split("").reverse().join("");
};

接下来是方法二

方法二: 双指针法

var isPalindrome = function (s) {
  // 我们先对字符串进行一下处理,只留下字母和数字
  s = s.replace(/\W/g, "").replace("_", "").toLowerCase();
  // 双指针法
  let left = 0;
  let right = s.length - 1;
  while (left < right) {
    if (s[left] === s[right]) {
      left++;
      right--;
    } else {
      return false;
    }
  }
  return true;
};

这样双指针法就做完了,是不是感觉也很简单呢

  • 时间复杂度: O(|s|),s是字符串的长度
  • 空间复杂度: O(1)

总结

今天的算法你学会了么?

我们面试的时候,一般都是手写算法,所以劝谏学习的朋友,要多手写,不要过分依赖IDE,每次要多总结出错的地方在哪里,才能更好的进步。加油哦!!