/*
* 题目:最长不含重复字符的子字符串
* 解法:动态规划
* 定义函数f(i)表示以第i个字符结尾的包含当前字符的不含重复字符的子字符串的最长长度
* 如果当前的第i个字符没有出现过,那么f(i)=f(i-1)+1,如果已经出现过,设当前元素与上次出现的距离为d,如果d小于等于
* f(i-1),说明上次出现的字符出现在f(i-1)对应的最长字符串之中,f(i)=d;如果d大于f(i-1),则f(i)=f(i-1)+1
* */
1 public static int longestSubstringWithoutDuplication(String str){
2 int curLength=1;
3 int maxLength=0;
4 // 创建一个长度为26的数组保存每个字符上次出现时在字符串中的下标
5 int[] position=new int[26];
6 for(int i=0;i<26;i++){
7 position[i]=-1;
8 }
9 //保存第0个字符出现时在字符串中的下标
10 position[str.charAt(0)-'a']=0;
11 int len=str.length();
12 for (int i=1;i<len;i++){
13 if (position[str.charAt(i)-'a']!=-1){
14 //说明此字符已经出现过
15 int d=i-position[str.charAt(i)-'a'];
16 if (d>curLength){
17 curLength=curLength+1;
18 }else {
19 curLength=d;
20 }
21 position[str.charAt(i)-'a']=i;
22 }else {
23 //没有有出现过
24 curLength=curLength+1;
25 position[str.charAt(i)-'a']=i;
26 }
27 if (curLength>maxLength) maxLength=curLength;
28 }
29 return maxLength;
30 }