package leetcode.xuyi;
import org.junit.Test;
/**
* Created by ethan on 2015/5/4.
*/
public class LongestSubstringWithoutRepeatingCharacters {
// 记下字串的起始位置,当遇到substring中有的字符的时候,起始位置+1
// 如何确定是当前字符已经在之前的substring中出现:可一个长度为26的数组
public int lengthOfLongestSubstring(String s) {
int longest_start = 0;
int longest_end = 0;
int start = 0;
int end = 0;
int length = 0;
// 数组记录当前substring中出现在的字符
// 值考虑a - z的情况
boolean[] exist = new boolean[256];
while(end<s.length()){
int char_index = (int)s.charAt(end);
if(!exist[char_index]){
exist[char_index] = true;
if (end-start+1>length){
length = end-start+1;
// 这部分在本体中没有意义但是若要取出最长字串的时候会有用。
// longest_start = start;
// longest_end = end;
}
end ++;
}else{
int start_char_index = (int)s.charAt(start);
exist[start_char_index] = false;
start++;
}
}
System.out.println(longest_start + " " + longest_end);
return length;
}
// 用boolean[] 记录是否出现过的效率太低,可以用int[] 记录下数组的之前出现的位置与start比较即可,这样获得更高的效率
public int lengthOfLongestSubstring2(String s){
int start = 0;
int length = 0;
int[] loc = new int[256];
for (int i=0; i<loc.length; i++)
loc[i] = -1;
// i代表当前substring的end位置的index
for (int i=0; i<s.length(); i++){
if(loc[s.charAt(i)]>=start){
start = loc[s.charAt(i)]+1;
}else if(length < i-start+1){
length = i-start+1;
}
// 保存字符最新出现的位置
loc[s.charAt(i)] = i;
}
return length;
}
@Test
public void test3() {
System.out.println(lengthOfLongestSubstring2("abcabcbb"));
}
}
Longest Substring Without Repeating Characters
最新推荐文章于 2023-10-08 01:10:54 发布