public class LongestUnrepeatedString {
public static void main(String[] args) {
System.out.println(getLUS("abcdeb"));
System.out.println(getLUS("abcde"));
System.out.println(getLUS("abcarcbh"));
}
public static String getLUS(String patter) {
//因为字符一共有127种,且每一种都可以只用一个字节表示
Byte[] hashtable = new Byte[127];
//对字符串进行拆分
byte[] bytes = patter.getBytes();
//当前子串长度
int curlen = 0;
//最大子串长度
int maxlen = 0;
//当前子串的起始下标
int start = 0;
//最大子串的起始下标
int maxstart=0;
//用于把字节类型转换成字符串类型
StringBuilder tempstring = new StringBuilder();
//遍历字符串
for (int i = 0; i < bytes.length; i++) {
//如果当前的字符已经重复出现了
if (hashtable[bytes[i]] != null){
//且当前子串的长度大于之前最大子串长度
if (curlen > maxlen){
maxlen = curlen;
maxstart=start;
}
//举例: a,b,c,d,b,h,k;
//因为b已经重复出现了,所以我们要把[start,b(第一次出现的下标)]之间hash表置空
//置空了几次长度就要减几次,并且下次是从c开始
while (bytes[start] != bytes[i]){
hashtable[bytes[start]] = null;
start++;
curlen--;
}
start++;
}
//如果没有出现重复的字符,那长度++ 且hash表置1
else {
curlen++;
hashtable[bytes[i]] = 1;
}
}
if (curlen > maxlen){
maxlen = curlen;
maxstart = start;
}
for (int i = maxstart; i < maxlen+maxstart; i++) {
int k = bytes[i];
char c = (char) k;
tempstring.append(c);
}
return tempstring.toString();
}
}
最长不重复子串
最新推荐文章于 2024-07-19 19:11:19 发布