/*
* the basic idea is, keep a hashmap which stores the characters in string as keys
* and their positions as values, and keep two pointers which define the max substring.
* move the right pointer to scan through the string , and meanwhile update the hashmap.
* If the character is already in the hashmap,
* then move the left pointer to the right of the same character last found.
* Note that the two pointers can only move forward.
*/
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() < 1)
return 0;
HashMap map = new HashMap();
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+1-j);
}
return max;
}
/*
* Solution by me Runtime: 51 ms.Your runtime beats 80.99 % of java
* submissions. 思路:确定两个指针p1和p2,再new一个HashSet用来存储subString中的字符
* 循环:p2加1,如果HashSet不含有该字符,subString长度加1;如果含有该字符,把p1指向的字符删除,p1+1
*/
public int lengthOfLongestSubstring_1(String s) {
if (s == null || s.length() < 1)
return 0;
char[] arr = s.toCharArray();
Set set = new HashSet();
set.add(arr[0]);
int p1 = 0, p2 = 1;
int tempNum = 1, res = 1;
while (p2 < s.length()) {
while (set.contains(arr[p2])) {
set.remove(arr[p1++]);
tempNum--;
}
set.add(arr[p2++]);
tempNum++;
if (tempNum > res)
res = tempNum;
}
return res;
}