剑指 offer 48 最长不含重复字符的字符串(双指针+哈希表, 动态规划)

1 题目描述

 

2 算法思路

2.1 双指针+哈希表 

思路:

  • 使用两指针i ,j ,向右进行遍历
  • 每当遇到一个字符,就在hashmap中找
    • 如果hashmap中不存在,就加入到hashmap中
    • 如果存在,就更新左指针i ,缩小滑动窗口的范围

2.2 动态规划

动态解析:

  • 状态定义:dp[j] 代表,s[j] 为结尾的最长不含重复字符串的长度
  • 转移方程:设s[j]字符,左边最近相同字符的索引为i
    • 当 i < 0,代表左边不存在相同的字符,因此dp[j] = dp[j - 1] + 1;
    • 当 i 字符在dp[i -1]的范围内,dp[j] = j - i;
    • 当 i 字符在dp[i -1]的范围外,dp[j] = dp[ij- 1] + 1;

3 代码

3.1 

class Solution {
    public int lengthOfLongestSubstring(String s) {
        HashMap<Character,Integer> dic = new HashMap<>();
        int i = -1;
        int res = 0;
        for(int j = 0; j < s.length(); j++){
            if(dic.containsKey(s.charAt(j))) {
                i = Math.max(i,dic.get(s.charAt(j)));
            }
            dic.put(s.charAt(j),j);
            res = Math.max(res,j - i);
        }
        return res;
    }
}

3.2 

        HashMap<Character,Integer> dic = new HashMap<>();
        int res = 0;
        int temp = 0;
        for(int j = 0; j < s.length(); j++){
            int i = dic.getOrDefault(s.charAt(j), -1);  //获取当前字符在dic中的索引,如果不存在,返回-1
            dic.put(s.charAt(j),j);
            temp = temp < j - i ? temp + 1: j - i;
            res = Math.max(temp,res);
        }
        return res;

 

4 提交结果

4.1  

4.2 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值