原本遇到判断字符串中是否含有重复元素的问题总是使用for循环遍历进行判断,这一方法则需要O(n3)的时间复杂度,如果本身方法处于几个循环中,就会指数倍增加时间复杂度。类似于如下代码:

String[] a = s.split("");
int max = 1;
for(int i = 0; i < a.length; i++){
String[] b = new String[a.length - i];
b[0] = a[i];
int permax = 1;
for(int j = i + 1, k = 1; k < b.length && j < a.length; j++, k++){
boolean repeat = false;
for(String c: b){
if(a[j].equals(c)){
repeat = true;
}
}
if(repeat == false){
b[k] = a[j];
permax++;
if(permax > max){
max = permax;
}
}
else
break;
}
}

使用三层for循环

一种更快的判断方法则是使用HashMap或Hashset,利用HashMap中的containsValue()或Hashset中的contains()方法,可以直接判断出字符串中是否有重复的元素,需要的时间复杂度为O(n2),我使用的是HashMap,代码如下:

String[] a = s.split("");
HashMap<Integer, String> map = new HashMap<>();
int max = 1;
for(int i = 0; i < a.length; i++){
map.clear();
map.put(i, a[i]);
int permax = 1;
for(int j = i + 1 ;j < a.length; j++){
if(!map.containsValue(a[j])){
map.put(j, a[j]);
permax++;
if(permax > max){
max = permax;
}
}
else
break;
}
}

可以看见,代码中只使用了两层for循环,可以明显加快代码执行时间,要记住每次循环后要使用clear()方法将HashMap中所有映射删除。

使用HashMap或Hashset优化使用循环判断字符串中是否含有重复元素的更多相关文章

  1. JS判断数组中是否有重复元素的方法

    判断数组中是否有重复元素,最容易想到的方法是使用2重循环,逐个遍历,比较,但是这个是最慢,最笨的方法,百度得出了更好的方法. var ary = new Array("111",& ...

  2. java判断字符串中是否含有中文

    /** * 判断字符串中是否含有中文 */ public static boolean isCNChar(String s){ boolean booleanValue = false; for(in ...

  3. java判断字符串中是否含有汉字

    原文:http://www.open-open.com/code/view/1426332240717 判断字符串中是否含有汉字: String str = "test中文汉字"; ...

  4. Java判断字符串中是否含有英文

    实现代码: /* * 判断字符串中是否含有英文,包含返回true */ public boolean isENChar(String string) { boolean flag = false; P ...

  5. PHP判断字符串中是否含有中文

    <?php $str = "测试中文"; echo $str; echo "<hr>"; //if (preg_match("/^[ ...

  6. c# 判断字符串中是否含有汉字,数字

    正则表达式使用时需要引用 using System.Text.RegularExpressions; private void buttonX1_Click(object sender, EventA ...

  7. sql 判断字符串中是否含有数字和字母

    判断是否含有字母 select PATINDEX('%[A-Za-z]%', ‘ads23432’)=0 (如果存在字母,结果<>1) 判断是否含有数字 PATINDEX('%[0-9]% ...

  8. js判断字符串中是否含有指定汉语

    核心代码: function haveChinese(str,c){ if(escape(str).indexOf(escape(c))!=-1){ retrun true; } return fal ...

  9. Cracking-- 1.1 判断字符串中是否有重复字符

    第三种方法为位运算的方法. 位运算符: << 左移  & 与 | 或 #include <iostream> #include <string> #incl ...

随机推荐

  1. Go语言库系列之flag

    背景 终端(命令行)操作是程序员的必备技能,但是你知道怎么通过golang制作出如下命令吗? $ flag girl -h Usage of girl: -height int 身高 (default ...

  2. 十分钟一起学会Inception网络

    作者 | 荔枝boy 编辑 | 安可 一.Inception网络简介 二.Inception网络模块 三.Inception网络降低参数计算量 四.Inception网络减缓梯度消失现象 五.Ince ...

  3. 在Ngnix中配置支持Websocket

    使用SignalR实现Websocket实时数据传输时,前后端各自实现编码后,无法将Websocket调试通过.沮丧之时,负责配置网络代理的同事说,网络访问这块使用了Ngnix代理设置,可能是造成We ...

  4. jsp学习笔记day1

    一.jsp简介 JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%>结束. JSP是一种Java ...

  5. python编程学习路线及笔记

    话不多说,直接上图! 关于人工智能算法学习思路,欢迎浏览我的另一篇随笔:如果你想开始学习算法,不妨先了解人工智能有哪些方向? 之后博主将持续分享各大算法的学习思路和学习笔记:hello world: ...

  6. 将本地项目关联到git上面

    1.github上面创建新项目 2.初始化项目-------------可忽略 首先加入git提交忽略的文件.gitignore文件 .idea 忽略以.idea文件logs/  忽略logs文件夹* ...

  7. 1098 Insertion or Heap Sort (25分)

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  8. STM32CubeMX工程定时器配置

    STM32CubeMX生成工程 选择自己的芯片型号 配置RCC寄存器时钟为外部晶振 单击芯片配置GPIO,选择输出方式,重命名标签等 进入时钟配置,本人使用的为8M外部晶振作为时钟源,PLL时钟源选择 ...

  9. (二) vim的Tabbar插件

    关闭Tabbar中一个buffer的技巧: 如果你使用Tabbar的同时还集成了某种窗口分割插件(如 Winmanager,NERDTree)或者vim处于分栏显示状态,这时你想用传统的 :bd 或 ...

  10. Scratch2的鸡兔同笼

    解题思路鸡兔同笼新算法:已知共有鸡和兔15只,共有40只脚,问鸡和兔各有几只.算法:假设鸡和兔训练有素,吹一声哨,它们抬起一只脚,(40-15=25) .再吹一声哨,它们又抬起一只脚,(25-15=1 ...