给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
例如对于字符串:str=“adfhdsla”,它的无重复字符的最长子串为:sub=“adfhdsl”
很显然,首先要有一个函数用以判断当前的子串中有无重复元素,然后寻找子串的工作就要用这个题的核心概念:滑动窗口
首先定义两个指针head, tail其中head=0, tail=1构成初始化窗口
- 如果arr[head]-arr[tail-1]指定的子串不含重复元素,则可以将窗口扩大即tail++
- 如果arr[head]-arr[tail-1]指定的子串含有重复元素,则此时的窗口两端的两个元素重复,则需要将head的一侧的字符去掉即head++
如此循环往复,就能穷举所有的含有不重复字符的子串,之后,设置一个标志位,记录子串长度,标记最长子串即可
public class MostLongSubString {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "abcabcbb";
System.out.println(lengthOfLongestSubstring(str));
}
public static int lengthOfLongestSubstring(String s) {
int start = 0;
int end = 1;
int maxSize = 1;
char[] chs = s.toCharArray();
while(end<chs.length) {
if(checkChar(chs, start, end)) {
//如果字符不重复,扩张窗口
int nowSize = end - start;
if(nowSize > maxSize) {
maxSize = nowSize;
}
end++;
}else {
//存在字符重复
start++;
}
//System.out.println(start+"--"+end);
}
return maxSize;
}
public static boolean checkChar(char[] arr, int s, int e) {
int a[] = new int[128];
for(int i = s; i < e; i++) {
int index = arr[i];
a[index] = a[index] + 1;
if(a[index] > 1) {
//字符重复
return false;
}
}
return true;
}
}
主要的用途在于,寻找一个符合某种规则的子串,比如最长上升子串这样