思路:
dp[i]表示的是以i结尾的最长不含重复字符的子字符串。使用了hashmap这个数据结构记录<char,index>
如果map中没有当前这个元素,那么dp[i]=dp[i-1]+1
如果map中存在当前的元素,一开始的想法是 dp[i]=i-map.get(array[i]),但是这样想有点问题,如果当前的字符串是abba的时候,按照刚才的思路dp[0]=1 dp[1]=2 dp[2]=1 dp[3]=3
但是dp[3]是错误的,因为中间存在了重复的字符。所以要加一种情况。
dp[i]=Math.min(dp[i-1]+1,i-map.get(array[i]))
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
public int lengthOfLongestSubstring (String s) {
if(s==null) return 0;
char[]array=s.toCharArray();
if(array.length==1){
return 1;
}
int[]dp=new int[array.length];
int maxLength=1;
HashMap<Character, Integer>map=new HashMap<>();
dp[0]=1;
map.put(array[0],0);
for(int i=1;i<array.length;i++){
dp[i]=1;
if(!map.containsKey(array[i])){
dp[i]=dp[i-1]+1;
}
else{
dp[i]=Math.min(dp[i-1]+1,i-map.get(array[i]));
}
map.put(array[i],i);
maxLength=Math.max(maxLength,dp[i]);
}
return maxLength;
}
}