「这是我参与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,每次要多总结出错的地方在哪里,才能更好的进步。加油哦!!