问题描述:给出一个字符串,求出该字符串中不包含重复字符的子串的最大长度
解答1:
public class Solution {
public int lengthOfLongestSubstring(String s) {
HashSet<String> arr = new HashSet<String>();
int i = 0;
int j = 1;
int m = 0, n = 1;//初始子串位置
arr.add(s.substring(i,j));
while(j < s.length()){
String a = s.substring(j, j+1);
if(arr.contains(a)){
if(arr.size() > (n-m)){
m = i;
n = j;
}
while(!a.equals(s.substring(i, i+1))){
arr.remove(s.substring(i, i+1));
++i;
}//更新子串位置
++i;
++j;
}else{
arr.add(s.substring(j, j+1));
j++;
}
}
return n-m;
}
}
解答2:
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length() == 0)
return 0;
HashMap<String, Integer> arr = new HashMap<String, Integer>();//<字符->位置>
int i = 0;
int j = 1;
int m = 0, n = 1;
arr.put(s.substring(i,j), i);
while(j < s.length()){
String a = s.substring(j, j+1);
Integer in = arr.get(a);
if(in != null){
if(arr.size() > (n-m)){
m = i;
n = j;
}
for(int x = i; x < in; x++){
arr.remove(s.substring(x, x+1));
}
arr.put(a, j);
i = in+1;
++j;
}else{
arr.put(s.substring(j, j+1), j);
j++;
}
}
if(arr.size() > (n-m)){
m = i;
n = j;
}
return n-m;
}
}