求最长的无重复字符的子串
BF方法的时间复杂度是O(n^3),对每个substring都看看是不是有重复的字符,找出其中最长的。优化的方法是通过动态规划。
package leetcode.longestsubstringwithoutRepeatingCharacters;
? ?
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
? ?
public class LongestSubstringWithoutRepeatingCharacters {
? ?
static int[] last = new int[128];//last数组用于保存新出现的字符的下标
? ?
public static int lengthOfLongestSubstring(String s) {
int start = 0;
int len = 0;
char[] w = new char[s.length()];//将字符串转换为字符数组
w = s.toCharArray();
System.out.println(w[1]-‘ ‘);
for (int i = 0; i < 128; i++)
last[i] = -1;// last数组用于保存新出现的字符的下标,一开始全部初始化为-1
for (int i = 0; i < s.length(); ++i) {
if (last[w[i] - ‘ ‘] >= start) { // 当前这个字符出现过
if (i - start > len)
len = i - start;
start = last[w[i] - ‘ ‘] + 1; // 从这个字符首次出现的位置+1,重新扫描,相当于把前面抛开前面的字符串不谈
}
last[w[i] - ‘ ‘] = i;// 更新当前字符的下标
}
if (len > s.length() - start)// 针对没有重复字符的字符串
return len;
else
return s.length() - start;
}
? ?
public static void main(String args[]) {
String s = "aabcbab";
int l = lengthOfLongestSubstring(s);
System.out.println(l);
}
}
? ?
【leetcode】LongestSubstringWithoutRepeatingCharacters
原文:http://www.cnblogs.com/keedor/p/4366728.html