Js判断一个单词是否有重复字母
今天上午刷到一道题,大体是写一个方法判断一个单词中是否有重复的字母(或者说一个字符串中是否有重复的字符)。我的思路是一个字符一个字符地遍历,如果发现有重复的停止:
 function isIsogram(str) {
   str = str.toLowerCase();
   for (var i = 0; i < str.length; i++) {
     if (str.indexOf(str.charAt(i), i + 1) >= 0) {
       return false;
     }
   }
   return true;
 }
这种简单的场景下谈性能没什么意义,两次循环速度并不慢( str.indexOf() 也认为是一次循环,但由于是native的行为,速度很快)。 后来我看到了别的用正则的实现,虽然很简单,但一开始我确实没住这方面想:
 function isIsogram2(str) {
   return !/(.).*\1/i.test(str);
 }
或者:
function isIsogram2(str) {
  return !/^.*(.).*\1/i.test(str);
}
这两个其实没什么区别,前者优先查找字符串尾端,后者优先查找字符串前端。这个正则比较好理解,不多解释,比较让我惊讶的这个匹配的性能。因为判断一个字符串是否有重复字符这样的任务太简单,正因为太简单,所以代表目标字符串的规律性太小。如果用正则必然带来大量尝试和回溯,其实主观上会让人觉得性能很不好。不过好不好不是随便想一想就行的,还是要验证一下。决定性能到底是好是坏,当然看最坏情况下,两个算法的执行时间。构造这样一个单词: qwertyuiopas,没有字母重复,意味着两种算法都要跑完整的循环。
 console.time("loop");
 for(var i=0; i<400000; i++){
     isIsogram("qwertyuiopas");
 }
 console.timeEnd("loop");
 console.time("regexp");
 for(var i=0; i<400000; i++){
     isIsogram2("qwertyuiopas");
 }
 console.timeEnd("regexp");
看看运行结果: amazing! 这个实验证实了一个问题:javascript对正则确实有优化,使用正则的效率非常高。当然这句话也可以反过来理解,javascript中的字符串操作、循环太慢了。那么,对于正则还等什么呢,赶快用起来吧 转载 周骅
Js判断一个单词是否有重复字母的更多相关文章
- JS判断一个数组中有无重复元素(数字)
		
前段时间遇到了这个问题 也百度了很多 不过还是用自己的方法解决了 一个超级简单的方法 简单到令人发指 由于直接写文本太丑了 所以还是截图吧 嘻嘻嘻 假如有一个这样的数组 (这是假如 可能每个人的数据 ...
 - js 判断一个文本框是否获得焦点
		
1.js 判断一个文本框是否获得焦点 // 可以用document.activeElement判断 // document.activeElement表示当前活动的元素 // 查找你要判断的文本框 ...
 - js判断一个元素是否在数组中
		
js判断一个元素是否在数组中 var arr = ['a','s','d','f']; console.info(isInArray(arr,'a'));//循环的方式 function isInAr ...
 - Java判断一个字符串中有多少大写字母、小写字母和数字
		
Java判断一个字符串中有多少大写字母.小写字母和数字 思路: 大写字母就是A-Z之间,小写字母是a-z之间,数字就是0-9之间,于是做判断就好:用到的String知识点,遍历字符串, 长度方法len ...
 - JS判断一个字符串是否包含一个子串函数.
		
微信小程序 JS判断一个字符串是否包含一个子串函数. //str 字符串,name子串 contains:function(str,name){ if(str.indexOf( ...
 - js判断一个字符串中出现次数最多的字符及次数
		
最近面试总是刷到这个题,然后第一次的话思路很乱,这个是我个人思路 for循环里两个 if 判断还可以优化 var maxLength = 0; var maxStr = ''; var count = ...
 - js 判断一个点是否在一个多边形之内
		
出处: https://github.com/substack/point-in-polygon/blob/master/index.js github: https://github.com/sub ...
 - jquery and js 判断一个元素是否存在
		
一.javascript中判断一个元素是否存在 if(document.getElementById('example')){ // do sth } 二.jquery中判断一个元素是否存在 < ...
 - js 判断一个元素是否在滚动的可视区域内,不在就固定到可视区域的上方。
		
前言:最近工作中,有这样一个场景,判断一个元素是否在滚动的可视区域内,不在就固定到可视区域的上方.为了以后再次遇到,所以记录下来,并分享.转载请注明出处:https://www.cnblogs.com ...
 
随机推荐
- shell编程之重定向
			
标准输入,输出和错误---------------------------------文件文件 描述符---------------------------------输 ...
 - 【BZOJ】【1045/1465】【HAOI2008】糖果传递
			
思路题/神奇的转化…… orz hzwer 或许这个思路可以从单行而非环形的递推中找到?(单行的时候,从左往右直接递推即可…… 感觉好神奇>_<脑残患者想不出…… P.S.话说在$n\le ...
 - 【BZOJ】【1028】【JSOI2007】麻将
			
暴力/模拟 $n\leq400$,嗯……这是一个很小的数据范围= = 判断一副牌是不是听牌并求出听什么牌太麻烦了,干脆我们直接判是不是胡牌好了~ 枚举胡的是哪张牌,然后判一下加上这张牌后是否能胡. 算 ...
 - dblink应用
			
当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据. 用法例子: (1) ...
 - 剑指offer--面试题23
			
//该题原本想用递归实现,但却用循环实现了... //关键用了个队列 #include <queue> void Print(BinaryTreeNode* pRoot, std::que ...
 - destoon使用中的一些心得
			
//**************************index首页相关参数**************************************// //全局变量 {if $seo_titl ...
 - oracle Array类型作为参数传入函数(存储过程)   大字符串参数解决方案
			
1. 创建自定义的类型.由于Oracle没有提供现成的array类型,这里用table类型来模拟. CREATE OR REPLACE TYPE varchar_array is Table OF v ...
 - AJAX实现仿Google Suggest效果
			
修复了一些细节代码(支持持续按键事件) *项目名称:AJAX实现类Google Suggest效果*作者:草履虫(也就是蓝色的ecma)*联系:caolvchong@gmail.com*时间:2007 ...
 - c3p0 --2
			
c3p0号称是java界最好的数据池. c3p0的配置方式分为三种,分别是 1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一个c3p ...
 - CSLight研究院之学习笔记结合NGUI(一)
			
原地址:http://www.xuanyusong.com/archives/3088 这两天一直在研究CSLight,目前Unity热更新的方式有两种,一种是ulua这个网上的例子已经很多了.还有一 ...