题目:输入一个字符串(只包含 a~z 的字符),求其最长不含重复字符的子字符串的长度。例如对于 arabcacfr,最长不含重复字符的子字符串为 acfr,长度为 4。
思路:
1、如果遍历到的字符没有出现过,则f(i)=f(i-1)+1;其中f(i)表示当前遍历到的字符不重复的距离,即currentLength;
2、如果出现过:分两种情况讨论:遍历到的第i个字符和它上次出现在字符串中的位置的距离d;
- 如果d>f(i-1), 则f(i)=f(i-1)+1;
- 如果d<=f(i-1),则f(i)=d;
代码:
package Array;
/**
* 最长不含重复字符的子字符串
* @Author: AnNing
* @Description:
* @Date: Create in 20:28 2019/7/23
*/
public class LongestSubStringWithoutDuplication {
public static int longestSubStringWithoutDuplication(String str) {
int curLength=0;
int maxLength=0;
//创建一个长度为26的数组position用来存储每个字符上次出现在字符串中位置的下标
int [] position=new int[26];
for(int i=0;i<position.length;i++){
position[i]=-1;
}
int length=str.length();
for(int i=0;i<length;i++){
int prevIndex=position[str.charAt(i)-'a'];
//如果字符出现过,则判断出现的位置和当前字符的距离是否比f(i)小
if(prevIndex<0||i-prevIndex>curLength)
curLength++;
else {
if(curLength>maxLength)
maxLength=curLength;
curLength=i-prevIndex;
}
//在扫描字符串时遇到的某个字符,就把该字符在字符串中的位置存储到数组对应的元素中
position[str.charAt(i)-'a']=i;
}
if(curLength>maxLength)
maxLength=curLength;
return maxLength;
}
public static void main(String [] args){
String s="arabcacfr";
int a=longestSubStringWithoutDuplication(s);
System.out.println(a);
}
}