LeetCode 第3题
第一种写法,但是时间花费比较长
class Solution {
int step = 0;
public int lengthOfLongestSubstring(String str) {
if(str.length() == 0){
return 0;
}
int count = 1;
int left = 0;
int right = 0;
while(right < str.length()-1) {
if(check(str, left, right)) {
right++;
if(right-left+1 > count) {
count = right-left+1;
}
}else {
left += step;
right += step;
while(right < str.length() && !contains(str, left, right)) {
left++;
right++;
}
}
}
return count;
}
public boolean check(String s, int left, int right) {
char c = s.charAt(++right);
for(int i = left; i < right; i++) {
if(s.charAt(i) == c) {
step = i-left+1;
return false;
}
}
return true;
}
public boolean contains(String s, int left, int right) {
List<Character> list = new ArrayList<Character>();
for(int i = left; i < right+1; i++) {
char charAt = s.charAt(i);
if(list.contains(charAt)) {
return false;
}
list.add(charAt);
}
return true;
}
}
第二种用map做优化,map中存元素下标
class Solution {
int step = 0;
public int lengthOfLongestSubstring(String str) {
int left = 0;
int right = 0;
int length = str.length();
Map<Character, Integer> map = new HashMap<Character, Integer>();
while(left < length && right < length) {
char charAt = str.charAt(right);
if(map.containsKey(charAt)) {
left = Math.max(map.get(charAt)+1, left);
if(right-left+1 > step) {
step = right-left+1;
}
map.put(charAt, right);
right++;
}else {
map.put(charAt, right);
right++;
if(right-left > step) {
step = right-left;
}
}
}
return step;
}
}