class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.empty()) {
return 0;
}
unordered_map<char, int> mp;
int a = 1;
mp[s[0]] = 0;
int res = 1;
for(int i = 1; i < s.length(); ++i) {
if(mp.find(s[i]) == mp.end()) {
++a;
} else {
int k = mp[s[i]];
a = (i - k <= a) ? (i - k) : (a + 1);
}
res = max(res, a);
mp[s[i]] = i;
}
return res;
}
};
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
chaMap = {}
l = 0
res = 0
for i in range(len(s)):
if s[i] in chaMap:
l = max(l, chaMap[s[i]] + 1)
res = max(res, i - l + 1)
chaMap[s[i]] = i
return res
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.empty()) return 0;
int max = 1, prev = 1;
for (int i = 1; i < s.length(); i++) {
int k;
for (k = i - prev; k < i; k++)
if (s[k] == s[i]) break;
if (k == i) prev += 1;
else prev = i - k;
max = std::max(max, prev);
}
return max;
}
};
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int max = 0, start = -1;
for (int i = 0; i < s.length(); i++) {
char cur = s.charAt(i);
if (map.containsKey(cur)) {
start = Math.max(start, map.get(cur));
}
max = Math.max(max, i - start);
map.put(cur, i);
}
return max;
}
}
public int lengthOfLongestSubstring(String s) {
int max = 0;
char[] arr = s.toCharArray();
int n = arr.length;
HashMap<Character,Integer> hashMap = new HashMap<>();
int l = 0,r = 0;
while(r < n){
char ch = arr[r];
if(hashMap.containsKey(ch)){
int index = hashMap.get(ch);
if(index >= l){
l = index + 1;
}
}
hashMap.put(ch,r);
// System.out.println(l + " " + r);
max = Math.max(max, r - l +1);
r++;
}
return max;
}
共以下 14 个回答
class Solution {
public int dismantlingAction(String arr) {
if(arrnull||arr.length()0){
return 0;
}
int[] dp = new int[arr.length()];
dp[0]=1;
int res = 1;
Map<Character,Integer> map = new HashMap<>();
map.put(arr.charAt(0),0);
for(int i=1;i<arr.length();i++){
if(!map.containsKey(arr.charAt(i))){
dp[i] = dp[i-1]+1;
}else{
int k = map.get(arr.charAt(i));
dp[i] =i-k<=dp[i-1]?i-k:dp[i-1]+1;
}
map.put(arr.charAt(i),i);
res = Math.max(res,dp[i]);
}
return res;
}
}
动态规划
“`java map = new HashMap<>();
class Solution {
public int dismantlingAction(String arr) {
if (arr == null || “”.equals(arr)) {
return 0;
}
//dp[j]表示以第j位字母结束的连续不重复招数
//假设arr[i]是于arr[j]重复的元素,
// if i < 0,dp[j] = dp[j-1] + 1; i < 0时,dp[j - 1] < dp[j] 恒成立,所以dp[j - 1] < j - i恒成立 //if dp[j - 1] < j - i,说明重复元素在范围外,dp[j] = dp[j - 1] + 1 //dp[j - 1] = j - i,dp[j] = dp[j - 1] = j - i //dp[j - 1] > j – i,dp[j] = j – i
//最终合并成两个条件
//dp[j – 1] < j - i,dp[j] = dp[j - 1] + 1 //dp[j - 1] >= j – i, dp[j] = j – i;
int length = arr.length();
int pre = 0;
int max = 0;
Map
for (int j = 0; j < length; j++) { int i = map.getOrDefault(arr.charAt(j), -1); map.put(arr.charAt(j), j); if (pre < j - i) { pre = pre + 1; } else { pre = j - i; } max = Math.max(max, pre); } return max; } }
时间复杂度:O(n)
空间复杂度:O(n)
MY非模版
【思路】DP,dp[i]代表以s[i]结尾的最长不重复子串长度,可以将额外空间压缩到O(1)
【复杂度】时间O(n^2),空间O(1);如果使用map,尽管回溯check时间变短,空间复杂度会上升
动态规划
时间:O(n)
空间:O(c),常数
思路:滑动窗口——建立哈希表窗口,每次窗口增大后,检测是否有重复字符,有则消除;然后更新最大长度
时间复杂度:O(n) 空间复杂度:O(n)
同向双指针的特点更明显。都没意识到自己用了单变量的dp
C++实现
“`C++ hashmap;
int lengthOfLongestSubstring(string s) {
unordered_map
int left = 0;
int right = 0;
int maxLen = 0;
}
“`
双指针复杂度O(n)