剑指 offer 48 最长不含重复字符的子字符串
动态规划
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.isEmpty()){
return 0;
}
int len = s.length();
int[] dp = new int[len];
dp[0] = 1;
Map<Character,Integer> map = new HashMap<>();
map.put(s.charAt(0),0);
for (int i=1;i<len;i++){
char c = s.charAt(i);
if (map.containsKey(c)){
int d = i-map.get(c);
if(d<=dp[i-1]){
dp[i]=d;
}else{
dp[i] = dp[i-1]+1;
}
map.replace(c,i);
}else{
dp[i] = dp[i-1]+1;
map.put(c,i);
}
}
int res =dp[0];
for (int i=0;i<len;i++){
res = Math.max(res,dp[i]);
}
return res;
}
}
时间复杂度
O
(
n
)
O(n)
O(n),
n
n
n是字符串的长度,要从头到尾遍历一遍字符串。
空间复杂度
O
(
n
)
O(n)
O(n),辅助数组长度是
O
(
n
)
O(n)
O(n),哈希表最坏情况下是
O
(
n
)
O(n)
O(n)。