这道题说是要用动态规划,其实比较抽象。这道题的动态规划思路是,设定函数f(i)代表以第i个字母为最后字符的最大不重复子串的长度。再向前遍历,保存这个字符上一次出现的位置与这次出现的差的长度,然后分类讨论,若这个长度大于以上一个字符为结尾的最大长度,说明以当前字符为结尾的最大长度是以上一个字符为结尾的最大长度加一。若这个长度小于以上一个字符为结尾的最大长度。则以当前字符为结尾的最大长度是这个字符上一次出现的位置与这次出现的差的长度。
public int lengthOfLongestSubstring(String s) {
char[] char_array = s.toCharArray();
int[] length_array = new int[char_array.length];
int max_num = 0;
for(int count = 0;count<char_array.length;count++){
length_array[count] = 0;
}
for(int count = 0; count<char_array.length;count++){
if(count != 0){
int count_inner = 1;
for(;count_inner <= s.length();count_inner++){
if(count - count_inner < 0){
break;
}
if(char_array[count]==char_array[count-count_inner]){
length_array[count] = count_inner;
break;
}
}
if(count_inner<=length_array[count-1]){
length_array[count] = count_inner;
}else{
length_array[count]=length_array[count-1] + 1;
}
}else{
length_array[count] = 1;
}
}
for(int count = 0;count<length_array.length;count++){
if(length_array[count] > max_num){
max_num = length_array[count];
}
}
return max_num;
}