String.toCharArray()的速度是String.split("")的5倍。
自己写的算法,第一次竟然花了2千多ms,主要是用了split,速度太慢了。
改了之后,速度到了600多ms,还是很差
public int lengthOfLongestSubstring(String s) {
if(s==(""))return 0;
if(s.length()==1)return 1;
//将String换成Character
List<Character> list=new ArrayList<Character>();
char[] strs=s.toCharArray();
list.add(strs[0]);
int max=0;
int tmax=0;
for(int i=1;i<strs.length;i++){
if(!list.contains(strs[i])){
list.add(strs[i]);
tmax=list.size();
if(tmax>max)max=tmax;
}
else{
int temp=list.size();
if(temp>max)max=temp;
int a=list.indexOf(strs[i]);
//System.out.println(a);
//撤回到重复的位置
i=i-(temp-a)+1;
//如果后面要匹配的元素还没有当前最大元素大,就直接返回
if((strs.length-i+1)<max)return max;
list.clear();
list.add(strs[i]);
}
}
return max;
}
第二种方法:速度提高了很多,到了大约60ms,主要是减少了重复的操作,而且用到了HashSet,搜索很快。
public int lengthOfLongestSubstring3(String s) {
if(s==null || s.length()==0)
return 0;
HashSet<Character> set = new HashSet<Character>();
int max=0;
int i=0;
int start=0;
while(i<s.length()){
char c = s.charAt(i);
if(!set.contains(c)){
set.add(c);
}else{
max = Math.max(max, set.size());
while(start<i&&s.charAt(start)!=c){
set.remove(s.charAt(start));
start++;
}
start++;
}
i++;
}
max = Math.max(max, set.size());
return max;
}
第三种方法,速度最快,只需要7ms左右,非常快
public int lengthOfLongestSubstring2(String s) {
if(s==null)
return 0;
boolean[] flag = new boolean[256];//字符的ASCII码,常用的是128个,扩展加了128个,所以一共有256个。使用这个标记就变得非常快了
<span style="white-space:pre"> </span>//计算机处理问题就是用0和1来进行的,所以,使用true和false非常符合计算机的处理特点,很快
int result = 0;
int start = 0;
char[] arr = s.toCharArray();
for (int i = 0; i < arr.length; i++) {
char current = arr[i];//当前位置
if (flag[current]) {
result = Math.max(result, i - start);
// the loop update the new start point
// and reset flag array
// for example, abccab, when it comes to 2nd c,
// it update start from 0 to 3, reset flag for a,b
for (int k = start; k < i; k++) {
if (arr[k] == current) {
start = k + 1;
break;
}
flag[arr[k]] = false;
}
} else {
flag[current] = true;
}
}
result = Math.max(arr.length - start, result);
return result;
}