You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.5 KiB
71 lines
1.5 KiB
package class013;
|
|
|
|
public class Code03_LongestNoRepeatSubstring {
|
|
|
|
public static int maxUnique(String str) {
|
|
if (str == null || str.equals("")) {
|
|
return 0;
|
|
}
|
|
char[] chas = str.toCharArray();
|
|
// map 替代了哈希表 假设字符的码是0~255
|
|
int[] map = new int[256];
|
|
for (int i = 0; i < 256; i++) {
|
|
map[i] = -1;
|
|
}
|
|
int len = 0;
|
|
int pre = -1;
|
|
int cur = 0;
|
|
for (int i = 0; i != chas.length; i++) {
|
|
pre = Math.max(pre, map[chas[i]]);
|
|
cur = i - pre;
|
|
len = Math.max(len, cur);
|
|
map[chas[i]] = i;
|
|
}
|
|
return len;
|
|
}
|
|
|
|
// for test
|
|
public static String getRandomString(int len) {
|
|
char[] str = new char[len];
|
|
int base = 'a';
|
|
int range = 'z' - 'a' + 1;
|
|
for (int i = 0; i != len; i++) {
|
|
str[i] = (char) ((int) (Math.random() * range) + base);
|
|
}
|
|
return String.valueOf(str);
|
|
}
|
|
|
|
// for test
|
|
public static String maxUniqueString(String str) {
|
|
if (str == null || str.equals("")) {
|
|
return str;
|
|
}
|
|
char[] chas = str.toCharArray();
|
|
int[] map = new int[256];
|
|
for (int i = 0; i < 256; i++) {
|
|
map[i] = -1;
|
|
}
|
|
int len = -1;
|
|
int pre = -1;
|
|
int cur = 0;
|
|
int end = -1;
|
|
for (int i = 0; i != chas.length; i++) {
|
|
pre = Math.max(pre, map[chas[i]]);
|
|
cur = i - pre;
|
|
if (cur > len) {
|
|
len = cur;
|
|
end = i;
|
|
}
|
|
map[chas[i]] = i;
|
|
}
|
|
return str.substring(end - len + 1, end + 1);
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
String str = getRandomString(20);
|
|
System.out.println(str);
|
|
System.out.println(maxUnique(str));
|
|
System.out.println(maxUniqueString(str));
|
|
}
|
|
}
|