题:
思:
六个月前是用暴力解法做的,今天一看,可以用动态规划来做嘛!
思路里最关键的一点在于Math.min
详见代码
码:
public int lengthOfLongestSubstring(String s) {
if(s.length() == 0) return 0;
// int maxLen = 0;
// map存的是 当前元素最后一次出现的位置
// dp存的是截止当前位置,从后往前没有重复元素的子串长度
Map<Character,Integer> map = new HashMap<Character,Integer>();
int dp[] = new int[s.length()];
dp[0] = 1;
map.put(s.charAt(0),0);
for(int i = 1 ; i < s.length() ; i++){
if(map.containsKey(s.charAt(i))){
// 这里取小值,是因为,有可能在你这个字符重复之前,你之前的子串里已经有过重复了。
dp[i] = Math.min(i - map.get(s.charAt(i)),dp[i-1]+1);
map.replace(s.charAt(i),i);
}else{
map.put(s.charAt(i),i);
dp[i] = dp[i-1]+1;
}
}
int maxLen = 0 ;
for(int i = 0 ; i < dp.length ; i++){
maxLen = Math.max(maxLen,dp[i]);
}
return maxLen;
}