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.

78 lines
1.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package class020;
public class Code03_LongestNoRepeatSubstring {
/*
* 给定一个只由小写字母a~z组成的字符串str 返回其中最长无重复字符的子串长度
*
*/
public static int lnrs1(String s) {
if (s == null || s.length() == 0) {
return 0;
}
char[] str = s.toCharArray();
int N = str.length;
int max = 0;
for (int i = 0; i < N; i++) {
boolean[] set = new boolean[26];
for (int j = i; j < N; j++) {
if (set[str[j] - 'a']) {
break;
}
set[str[j] - 'a'] = true;
max = Math.max(max, j - i + 1);
}
}
return max;
}
public static int lnrs2(String s) {
if (s == null || s.length() == 0) {
return 0;
}
char[] str = s.toCharArray();
int N = str.length;
int[] last = new int[26];
for (int i = 0; i < 26; i++) {
last[i] = -1;
}
last[str[0] - 'a'] = 0;
int max = 1;
int preMaxLen = 1;
for (int i = 1; i < N; i++) {
preMaxLen = Math.min(i - last[str[i] - 'a'], preMaxLen + 1);
max = Math.max(max, preMaxLen);
last[str[i] - 'a'] = i;
}
return max;
}
// for test
public static String getRandomString(int possibilities, int maxSize) {
char[] ans = new char[(int) (Math.random() * maxSize) + 1];
for (int i = 0; i < ans.length; i++) {
ans[i] = (char) ((int) (Math.random() * possibilities) + 'a');
}
return String.valueOf(ans);
}
public static void main(String[] args) {
int possibilities = 26;
int strMaxSize = 100;
int testTimes = 1000000;
System.out.println("test begin, test time : " + testTimes);
for (int i = 0; i < testTimes; i++) {
String str = getRandomString(possibilities, strMaxSize);
int ans1 = lnrs1(str);
int ans2 = lnrs2(str);
if (ans1 != ans2) {
System.out.println("Oops!");
}
}
System.out.println("test finish");
}
}