题目:给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,”pwke” 是 子序列 而不是子串。
思路:用一个数组记录字符串的字符数组,一个LInkList集合记录子串,如果子串集合不包含当前字符,则当前字符加入集合,同时记录子串长,判断与最长子串的长度大小。如果已经包含当前字符,则清除子串元素直到重复元素的前一个元素为止
public int lengthOfLongestSubstring(String s)
{
char[] arr=s.toCharArray();
//存储子串的值
LinkedList temp=new LinkedList();
//记录最长的子串的长度
int num=0;
//记录当前子串长度
int currentNum=0;
//如果子串不包含当前字符,则加入子串,同时记录子串长度,同时判断当前字符长度是否大于最长字符长度。
//如果子串包含当前字符,则依旧把当前字符加入子串,然后删除元素直到重复元素的第一个元素
for(int i=0;i<arr.length;i++)
{
if(!temp.contains(arr[i])){
temp.add(arr[i]);
currentNum=temp.size();
if(currentNum>num)
{
num=currentNum;
}
}else{
temp.add(arr[i]);
//找到重复的元素在子串中前面的那个元素的位置,例如:"jpwp"则找的位置是1
int len=temp.indexOf(arr[i]);
//LinkList的remove从位置为0的地方开始移除,这里的意思是直到把重复元素的位置靠前的那个删除,例如:"jpwp"则删除元素直到"wp"
//这里注意LinkList在remove元素时候的方式,即从0位置开始
for(int j=0;j<len;j++)
{
temp.remove();
}
temp.remove();
}
}
return num;
}