请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
剑指 Offer 48. 最长不含重复字符的子字符串 - 力扣(LeetCode) (leetcode-cn.com)
思路:动态规划,用map存储字符在字符串中最后一次出现的位置,假设以当前字符为结尾的字符串的最长不重复串的长度为dp[i],如果s[i]没在map里出现过,说明该字符前面没有出现过该字符,那么dp[i]=dp[i-1]+1;如果s[i]在map里有出现过,对应的下标为j,如果i-j>dp[i-1],说明在以当前字符为结尾的字符串的最长不重复串仍然没有重复,此时dp[i]=dp[i-1]+1;如果i-j<=dp[i-1],说明出现了重复字符,dp[i] = i - j.
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null || s.length() == 0){
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);
int max = 1;
char c;
int index = 0;
for(int i = 1; i < len; i++ ){
c = s.charAt(i);
index = map.getOrDefault(c,-1);
if(dp[i - 1] >= i - index){
dp[i] = i - index;
}else{
dp[i] = dp[i - 1] + 1;
}
if(dp[i] > max){
max = dp[i];
}
map.put(c,i);
}
return max;
}
}