系列文章
题目
闲话少说,先看题目:
大致意思就是忽略大小写,判断字符串中是否存在重复的字符,如果存在则返回 false,否则返回 true。
解析
题目很简单,直接开整。
首先用最笨的思路一步步来:
- 设置一个
count = 0,一个emptyArr = [] - 将字符串转小写(或大写)
- 遍历字符串,判断字符是否存在
emptyArr中,如果存在则count ++ - 如果最后
count === 0,则返回true,否则返回false
照着上面的思路将代码敲出来即可:
function isIsogram(str) {
let count = 0,
emptyArr = [];
for (const c of str) {
if (emptyArr.includes(c)) {
count++;
}
emptyArr.push(c);
}
return count === 0;
}
优化
看着上面的代码,想必你一定一脸便秘的表情。
这么简单的功能,写成这样???
别急,慢慢来嘛,让我们再来分析分析题目。显然,其核心是:
- 判断字符串中是否存在重复的字符
既然和重复有关,那就好说了,我们都知道,ES6 中的 Set 可以去除数组(类数组)中的重复元素。那么我们可以按照如下思路来实现需求:
- 将
str转小写(或大写)后转化成一个Set - 判断
Set.size是否等于str.length - 如果最后
Set.size === str.length,则返回true,否则返回false
那么我们照着思路将代码敲出来看看:
function isIsogram(str) {
const set = new Set(str.toLowerCase());
return set.size === str.length;
}
现在看起来舒服些了吧。
其他思路
对于这样一个小小的功能,上面的代码已经差不多了,这里我们看看大佬们其他思路的代码:
function isIsogram(str){
return !/(\w).*\1/i.test(str)
}
显然,判断字符的操作,正则是非常不错的选择。