- 题目:求最长子串(子串中没有重复元素)
- 难度:Medium
我的思路:遍历字符串,定义三个变量:result-记录当前最长子串,max-记录当前最长子串长度,curr-当前子串,用于更新result的
- 第i个元素不在curr里,则将第i个加到curr,并且比较max和curr的长度,curr.length()大于max的话,则更新result=curr,max=curr.length()
- 第i个元素已经curr出现,则在curr中找到等于第i个元素的index,取index后面的一串字串作为curr
代码:
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null || s.length() <= 1){
return s.length();
}
int len = s.length();
String result = "" + s.charAt(0);
String curr = result;
int max = 1;
for(int i = 1; i < len; i++){
char ch = s.charAt(i);
if(curr.indexOf(ch) == -1){
curr += ch;
if(curr.length() > max){
result = curr;
max = curr.length();
}
}else{
//出现重复元素
int index = curr.indexOf(ch);
curr = curr.substring(index+1);
i--;
}
}
return max;
}
}
- 方法二:利用两个指针和HashMap
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null || s.length() <= 1){
return s.length();
}
int len = s.length();
HashMap<Character, Integer> map = new HashMap<>();
int start = 0;//记录子串的起始位置
int max = 0;//记录最长子串长度
for(int i = 0; i < len; i++){
char ch = s.charAt(i);
if(map.containsKey(ch)){
start = Math.max(start, map.get(ch)+1);
}
max = Math.max(max, i-start+1);//将当前元素加入子串中
map.put(ch,i);
}
return max;
}
}