描述
从字符串中找出一个最长的不包含重复字符的子字符串,返回该子字符串的长度。
动态规划
分析:
长度为N的字符串,有(1+N)*N/2 个子字符串,
状态定义:dp[j],代表以字符s[j]为结尾的最长不重复子字符串的长度。
初始状态:
转移方程:固定右边界j,设在s[j]左侧,且与s[j]距离最近的相同字符为s[i];
- 若左侧无相同字符,则dp[j]=dp[j-1]+1;
- 若dp[j–1]<j-i 则 dp[j]=dp[j-1]+1;
- dp[j-1]>=j-i;
返回值:最长的子字符串长度max(dp)
实际代码
利用哈希表来统计各个字符最后一次出现的索引位置。遍历时获取最近的相同字符位置。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> dic;
int res = 0, tmp = 0, len = s.size(), i;
for(int j = 0; j < len; j++) {
if(dic.find(s[j]) == dic.end()) i = - 1;
else i = dic.find(s[j])->second; // 获取索引 i
dic[s[j]] = j; // 更新哈希表
tmp = tmp < j - i ? tmp + 1 : j - i; // dp[j - 1] -> dp[j]
res = max(res, tmp); // max(dp[j - 1], dp[j])
}
return res;
}
};
作者:Krahets
链接:https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5dz9di/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。