javascript检查重复字符串
题目描述
给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false。
思路一
最直接的方法就是暴力循环检测是否有重复字母出现。
function containsRepeatingLetter(str) {
// 第一步
// 将非字母替换为空
var tmp = str.replace(/[^a-zA-Z]*/g, '');
// 当替换后字符串长度小于2时,字符串中不包含重复字母
if (tmp.length < 2) {
return false;
}
// 第二步
// 接下来正式开始判断
var rstr = ""; // 声明一个空字符串用于存放已经遍历的字母
// 循环遍历 tmp
for (var i = tmp.length - 1; i >= 0 ; i--) {
// 如果出现重复字母,则退出循环,此时rstr字符串长度必定小于tmp字符串长度
if (rstr.indexOf(tmp[i]) !== -1) {
break;
}
rstr += tmp[i];
}
// 遍历结束后,比较tmp与rstr字符串长度
return rstr.length < tmp.length;
}
思路二
我们可以将上面的第二步换一个角度来思考: 我们把字符串先转化为数组,当数组中有重复的值的时候,我们来观察一下他们键和值的特点。
var arr = ['a', 'b', 'a'];
a[0] === 'a'
a[1] === 'b'
a[2] === 'a'
// 发现了数组的键始终是惟一的,那我们把数组的键和值调换一下位置看看
a['a'] = 0
a['b'] = 1
a['a'] = 2
此时看一下第一次赋值将会被第三次赋值覆盖:
console.log(a) // a['a'] = 2 a['b'] = 2 此时只有两个键
由此我们对思路一的第二步改一下:
function containsRepeatingLetter(str) {
// 第一步
// 将非字母替换为空
var tmp = str.replace(/[^a-zA-Z]*/g, '');
if (tmp.length < 2) {
return false;
}
// 第二步
// 字符串转数组
var arr = tmp.split('');
var reverse = [];
// 倒置数组键值
arr.forEach(function (value, index) {
if (!reverse[value]) {
reverse[value] = index;
reverse.length++;
}
});
return reverse.length !== arr.length;
}
思路三
我们可以直接使用强大的正则表达式来完成:
function containsRepeatingLetter(str) {
// \1 是对正则表达式中第一个匹配的引用,也就是 ([a-zA-Z]) 匹配字母中的任意一个
return /([a-zA-Z])[a-zA-Z]*\1/.test(str);
}
不过以上的方法只能检测字符串中是否有重复的字符出现, 那么下面我们来针对连续重复的字符做些修改
- 对字符串进行搜索
function containsRepeatingLetter(str) {
var len = str.length;
if (len < 2) {
return false;
}
for (i = 1; i < len; i++) {
if (str[i - 1] === str[i]) {
return true;
}
}
return false;
}
- 正则表表达式
function containsRepeatingLetter(str) {
// 利用正则表达式匹配字符串中连续的字符
return !!str.match(/([a-zA-Z])\1/);
}