leetcode第三题,hashset与hashmap
关于寻找最长的不重复的子字符串的一个简单的问题可以很好的使用到hashset与hashmap两个类。首先对hashset与hashmap两个类进行一个简单的解释与说明。
Set与HashSet
Set:hashset是set接口的实现类,关于接口set,以下文字是Java API中关于set接口的描述
public interface Set
extends Collection
不包含重复元素的集合。 更正式地,集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。 正如其名称所暗示的那样,这个接口模拟了数学集抽象。
Set接口除了继承自Collection接口的所有构造函数的合同以及add,equals和hashCode方法的合同外 , 还 增加了其他规定。 其他继承方法的声明也包括在这里以方便。 (伴随这些声明的规范已经量身定做Set接口,但它们不包含任何附加的规定。)
构造函数的额外规定并不奇怪,所有构造函数都必须创建一个不包含重复元素的集合(如上所定义)。
( java8中文版为原文链接)
下面我们就来看一下HashSet的常用的几个方法以及它的构造函数:
public HashSet() | 构造一个新的空集合 |
---|---|
public HashSet(Collection<? extends E> c) | 构造一个包含指定集合中的元素的新集合。 |
public boolean add(E e) | 将指定的元素添加到此集合(如果尚未存在) |
public boolean isEmpty() | 如果此集合不包含元素,则返回 true |
public void clear() | 从此集合中删除所有元素 |
public boolean contains(Object o) | 如果此集合包含指定的元素,则返回 true |
public boolean remove(Object o) | 如果存在,则从该集合中删除指定的元素 |
public int size() | 返回此集合中的元素数 |
public class Solution
{
public int lengthOfLongestSubstring(String s)
{
int n = s.length();
Set<Character> set = new HashSet<>();
int ans = 0, i = 0, j = 0;
while (i < n && j < n)
{ // try to extend the range [i, j]
if (!set.contains(s.charAt(j)))
{
set.add(s.charAt(j++));
ans = Math.max(ans, j - i);
}
else
{
set.remove(s.charAt(i++));
}
}
return ans;
}
}
Map与HashMap
类似地,HashMap类实现的是Map接口,首先是对Map接口的描述:
public interface Map<K,V>
将键映射到值的对象。 地图不能包含重复的键; 每个键可以映射到最多一个值。
用通俗的话来解释说就是:在Map中键就相当于是标识符,用于区别值,绝对不能重复,但值是可以重复的,这种关系类似于y(值)与x(键)的函数关系,一个y可以对应多个x,但一个x只能对应一个y;
下面我们来看看HashMap的构造函数与常用方法:
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
基于哈希表的实现的Map接口。 此实现提供了所有可选的地图操作,并允许null的值和null键。 ( HashMap类大致相当于Hashtable ,除了它是不同步的,并允许null)。这个类不能保证地图的顺序; 特别是,它不能保证订单在一段时间内保持不变
|
public HashMap() | 构造一个空的 HashMap |
---|---|
public int size() | 返回此地图中键值映射的数量 |
public boolean isEmpty() | 如果此地图不包含键值映射,则返回 true 。 |
public V get(Object key) | 返回到指定键所映射的值,或null如果此映射包含该键的映射 |
public boolean containsKey(Object key) | 如果此映射包含指定键的映射,则返回 true 。 |
public V put(K key,V value) | 将指定的值与此映射中的指定键相关联。 如果地图先前包含了该键的映射,则替换旧值。 |
public void putAll(Map<? extends K,? extends V> m) | 将指定地图的所有映射复制到此地图。 这些映射将替换此映射对当前在指定映射中的任何键的任何映射 |
public V remove(Object key) | 从该地图中删除指定键的映射(如果存在) |
此外,更详细的方法请参考上文链接
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>(); // current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
if (map.containsKey(s.charAt(j))) {
i = Math.max(map.get(s.charAt(j)), i);
}
ans = Math.max(ans, j - i + 1);
map.put(s.charAt(j), j + 1);
}
return ans;
}
}