[LeetCode][Java] Longest Substring Without Repeating Characters
2015-07-05 21:53
459 查看
题目:
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring withoutrepeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
题意:
给定一个字符串,找到这个字符串中最长不重复子串的长度。比如"abcabcbb" 的最长子串为"abc",长度为3。"bbbbb"的最长子串为 "b",长度为1.
算法分析:
介绍一种线性的算法,也是这类题目最常见的方法。* 基本思路是维护一个窗口,每次关注窗口中的字符串,在每次判断中,左窗口和右窗口选择其一向前移动。
* 同样是维护一个HashSet, 正常情况下移动右窗口,如果没有出现重复则继续移动右窗口,如果发现重复字符,
* 则说明当前窗口中的串已经不满足要求,继续移动有窗口不可能得到更好的结果,此时移动左窗口, 直到不再有重复字符为止,
* 中间跳过的这些串中不会有更好的结果,因为他们不是重复就是更短。
* 因为左窗口和右窗口都只向前,所以两个窗口都对每个元素访问不超过一遍,因此时间复杂度为O(2*n)=O(n),是线性算法。
* 空间复杂度为HashSet的size,也是O(n).
代码如下:
public class Solution { public int lengthOfLongestSubstring(String s) { int left=0; int right=0; int max=0; HashSet<Character> set =new HashSet<Character>(); char[] cs = s.toCharArray(); if (cs==null) return 0; while(right<cs.length) { if(!set.contains(cs[right])) { set.add(cs[right]); } else { if(max<right-left) max=right-left; while(cs[left]!=cs[right]) { set.remove(cs[left]); left++; } left++; } right++; } return Math.max(max,right-left); } }
相关文章推荐
- JAVA面向对象第二天
- Java核心技术I——基础点拾掇(第六章)
- Java - Thinking in Java 第2章 一切都是对象
- scala eclipse plugin 插件安装
- 你应该更新的 Java 知识之常用程序库【转载】
- JAVA面向对象第一天
- Spring Mvc+ajax发送请求参数接收问题
- JAVA-反射-getGenericSuperclass()介绍
- Java程序设计日志一
- MyBatis查询传一个参数时报错:There is no getter for property named 'sleevetype' in 'class java.lang.Integer
- Eclipse主题更换方法
- java 线程基础知识
- [LeetCode][Java] Add Two Numbers
- 关于mac版eclipse的配置问题
- javaSE学习笔记之反射
- Eclipse关闭检查
- java 错误:由于文件名不对所造成
- eclipse 远程调试mapreduce
- [LeetCode][Java] Two Sum
- 一种JAVA线程轮训调度算法(转载)