lintcode: 最长无重复字符的子串
2016-03-07 10:28
459 查看
题目
最长无重复字符的子串给定一个字符串,请找出其中无重复字符的最长子字符串。
例如,在"abcabcbb"中,其无重复字符的最长子字符串是
"abc",其长度为
3。
对于,
"bbbbb",其无重复字符的最长子字符串为
"b",长度为
1。
解题
利用HashMap,map中不存在就一直加入,存在的时候,找到相同字符的位置,情况map,更改下标
public class Solution { /** * @param s: a string * @return: an integer */ public int lengthOfLongestSubstring(String s) { // write your code here HashMap<Character,Integer> map = new HashMap<Character,Integer>(); if(s == null) return 0; if(s.length() <=1) return s.length(); int longest = -1; for(int i = 0;i<s.length();i++){ char ch = s.charAt(i); if(map.containsKey(ch)){ longest = Math.max(map.size(),longest); i = map.get(ch); map.clear(); }else{ map.put(ch,i); } } longest = Math.max(map.size(),longest); map.clear(); return longest; } }
利用数组来判断该元素是否已经存在过
public class Solution { /** * @param s: a string * @return: an integer */ public int lengthOfLongestSubstring(String s) { // write your code here if(s == null) return 0; if(s.length() <=1) return s.length(); int longest = -1; int start = 0; boolean[] flag = new boolean[256]; char[] arr = s.toCharArray(); for(int i =0;i< arr.length;i++){ char cur = arr[i]; if(flag[cur]){ longest = Math.max(longest,i - start); for(int k = start;k<i;k++){ if( arr[k] == cur){ start = k + 1; break; } flag[arr[k]] = false; } }else{ flag[cur] = true; } } longest = Math.max(longest,arr.length - start); return longest; } }
相关文章推荐
- DP(斜率优化):HDU 3507 Print Article
- 多坐标点地图全部显示
- Android binder (8): 为何binder比D-Bus的效率高,高多少?
- 关于客户端向服务器发送请求的加密问题
- aop的代码原理+理论
- Office 365 - SharePoint Tips & Tricks
- 转:WebClient类(温习一下)
- bzoj 2820 YY的GCD(莫比乌斯反演)
- 2016蓝桥杯假期任务之《概率计算》
- 论JavaScript模块化编程
- 序列化的作用
- MVVM with ReactiveCocoa
- RunLoop
- IP限速
- 图示7大常见排序算法
- Android px、dp、sp之间相互转换
- Android binder (7): 看个例子,如何通信
- JS事件冒泡
- eclipse快捷键
- Java 回顾笔记_多线程_2