3. Longest Substring Without Repeating Characters

来源:互联网 发布:bs点炒股软件 编辑:程序博客网 时间:2024/06/16 13:48

Given a string, find the length of the longest substring without repeating characters.

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be asubstring,"pwke" is a subsequence and not a substring.


我的思路:

每次用两个端点确定一个子字符串,其中左端点固定,右端点一支向右走,当遇到右端点指向的字符在该字符串中出现第二次时,说明去掉这个字符就是该子字符串的长度,和以前的最大长度比较。需要注意不要out of index.  从i到I+j长度为J+1

STRING的方法:

substring,indexOf,cahrAt

class Solution {   public int lengthOfLongestSubstring(String s) {        if(s.equals(""))        return 0;        else{        int len = s.length();            int max = 1;            for(int i = 0;i<len;i++){                for(int j=1;j<len-i;j++){                    String sub = s.substring(i,i+j);                                    if((sub.indexOf(s.charAt(i+j)))!=-1)                                            break;                      max = ((j+1)>max)?(j+1):max;                }            }            return max;        }    }}

别人的思路:  用哈希表存所有的字符,key是该字符的位置。同样用两个端点进行遍历,左端点固定,右端点前移,当遇到右端点的字符在哈希表中存在时就找到哈希表中相同字符第一次出现的位置,两者相减加一就是这个字符串的长度,和max相比。之后将左端点移动到第一次出现字符的下一个。

 public int lengthOfLongestSubstring(String s) {        if (s.length()==0) return 0;        HashMap<Character, Integer> map = new HashMap<Character, Integer>();        int max=0;        for (int i=0, j=0; i<s.length(); ++i){            if (map.containsKey(s.charAt(i))){                j = Math.max(j,map.get(s.charAt(i))+1);            }            map.put(s.charAt(i),i);            max = Math.max(max,i-j+1);        }        return max;    }


另外一种方法:使用Hashset进行映射子字符串中的各个字符,两个端点。左端点先固定,右端点向右移动,如果有重复字符,就把左边端点右移,直到可以继续添加字符。

public int lengthOfLongestSubstring(String s) {    int i = 0, j = 0, max = 0;    Set<Character> set = new HashSet<>();        while (j < s.length()) {        if (!set.contains(s.charAt(j))) {            set.add(s.charAt(j++));            max = Math.max(max, set.size());        } else {            set.remove(s.charAt(i++));        }    }        return max;}

关于hash map,hashset,hash table:
   HashMap:  http://www.cnblogs.com/chenssy/p/3521565.html

实际上HashMap是一个“链表散列”,HashMap底层实现还是数组,只是数组的每一项都是一条链。其中参数initialCapacity就代表了该数组的长度。
HashMap保存数据的过程为:首先判断key是否为null,若为null,则直接调用putForNullKey方法。若不为空则先计算key的hash值,然后根据hash值搜索在table数组中的索引位置,如果table数组在该位置处有元素,则通过比较是否存在相同的key,若存在则覆盖原来key的value,否则将该元素保存在链头(最先保存的元素放在链尾)。若table在该处没有元素,则直接保存。
方法:
put(key,value)
get(key)



hashset:http://blog.csdn.net/chenssy/article/details/21988605

HashSet继承AbstractSet类,实现Set、Cloneable、Serializable接口。其中AbstractSet提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作。Set接口是一种不包括重复元素的Collection,它维持它自己的内部排序,所以随机访问没有任何意义.

方法:

   iterator()方法返回对此 set 中元素进行迭代的迭代器。返回元素的顺序并不是特定的。

   size()返回此 set 中的元素的数量(set 的容量)。底层调用HashMap的size方法,返回HashMap容器的大小。

isEmpty(),判断HashSet()集合是否为空,为空返回 true,否则返回false

contains(),判断某个元素是否存在于HashSet()中,存在返回true,否则返回false。

add()如果此 set 中尚未包含指定元素,则添加指定元素。如果此Set没有包含满足(e==null ? e2==null : e.equals(e2)) 的e2时,则将e2添加到Set中,否则不添加且返回false。由于底层使用HashMap的put方法将key = e,value=PRESENT构建成key-value键值对,当此e存在于HashMap的key中,则value将会覆盖原有value,但是key保持不变,所以如果将一个已经存在的e元素添加中HashSet中,新添加的元素是不会保存到HashMap中,所以这就满足了HashSet中元素不会重复的特性。

remove如果指定元素存在于此 set 中,则将其移除。

     clear从此 set 中移除所有元素。


hashtable: http://blog.csdn.net/chenssy/article/details/22896871

阅读全文
0 0
原创粉丝点击