class Solution {
public int dismantlingAction(String arr) {
int n = arr.length();
if (n == 0)
return 0;
Map<Character,Integer> lastLoc = new HashMap<>();
int tmp = 0; int res = 0;
for(int j = 0 ;j < n;j++) {
int i = lastLoc.getOrDefault(arr.charAt(j),-1); // 记录最近一次相等字符的下标
lastLoc.put(arr.charAt(j),j);
if (i < 0)
tmp++;
else if(tmp < j-i)
tmp++;
else
tmp = j - i;
res = Math.max(tmp, res);
}
return res;
}
}
function lengthOfLongestSubstring(s: string): number {
let dir: Map<string, number> = new Map();
let t = -1;
let res = 0;
for (let i = 0; i < s.length; i++) {
if(dir.has(s.charAt(i))) {
t = Math.max(t,dir.get(s.charAt(i)));
}
dir.set(s.charAt(i),i);
res = Math.max(res,i - t);
}
return res;
};
class Solution {
public int lengthOfLongestSubstring(String s) {
char[] chars = s.toCharArray();
int n = chars.length;
int l=0,r=0;
Set<Character> set = new HashSet<>();
int res = 0;
while(r<n) {
if(!set.contains(chars[r])) {
set.add(chars[r]);
r++;
}else {
while(set.contains(chars[r])) {
set.remove(chars[l]);
l++;
}
}
res = Math.max(res, r-l);
}
return res;
}
}
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null || s.length() <= 0){
return 0;
}
//优化 =》 单个变量
Map<Character, Integer> map = new HashMap<>();
int a = 1;
map.put(s.charAt(0), 0);
int res = 1;
for(int i = 1; i < s.length(); i++){
if(!map.containsKey(s.charAt(i))){
a = a + 1;//就是没刷新a之前, a表示dp[i - 1]
}else{
int k = map.get(s.charAt(i));
a = i - k <= a ? i - k : a + 1;
}
res = Math.max(res,a);
map.put(s.charAt(i), i);
}
return res;
//时间复杂度:O(n)
//空间复杂度:O(n)
}
}
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character,Integer> map = new HashMap<>();
//以字符s[i]为结尾的不含重复字符的字符串
int res = 0, tmp = 0;
for(int i = 0; i < s.length(); i ++) {
int j = map.getOrDefault(s.charAt(i),-1);
map.put(s.charAt(i),i);
tmp = tmp < i - j ? tmp + 1 : i - j;
res = Math.max(res,tmp);
}
return res;
}
}
共以下 10 个回答
class Solution { dp(n,0); hashMap.end()){
public:
int lengthOfLongestSubstring(string s) {
int n = s.size();
if(n 0){
return 0;
}
vector
unordered_map<char,int> hashMap;
int res = 1;
// dp[i]表示以s[i]结尾时不重复字符的字符串长度
dp[0] = 1;
hashMap[s[0]] = 0;
for(int i = 1;i < n;++i){
if(hashMap.find(s[i])
dp[i] = dp[i-1] + 1;
}
else{
if(i – hashMap[s[i]] > dp[i-1]){ //重复字符不影响
dp[i] = dp[i-1] + 1;
}
else{
dp[i] = i – hashMap[s[i]];
}
}
res = max(res,dp[i]);
hashMap[s[i]] = i;
}
return res;
}
};
简单DP
滑动窗口:O(n)
class Solution {
public int lengthOfLongestSubstring(String s) {
//通过滑动窗口加hash找到
//也可以动态
Map<String,Integer> map =new HashMap<String,Integer>();
String s1[]=s.split(“”);
if(s.equals(“”)) return 0;
if(s1null||s1.length 0)
{
return 0;
}
int max= 1;
int left = 0;
map.put(s1[0],0);
for(int i=1;i<s1.length;i++)
{
if(!map.containsKey(s1[i]))
{
map.put(s1[i],i);
}else
{
left = Math.max(map.get(s1[i])+1,left);
map.put(s1[i],i);
}
max= Math.max(max,i-left+1);
}
return max;
}
}
8.7
Day28:下面是代码