leetcode.剑指offer.面试48.最长不含重复字符的子字符串

leetcode.剑指offer.面试48.最长不含重复字符的子字符串

题目

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

解题思路

此题在一个多月之前已经AK过,但是印象中当时做的时候也不是很顺利,思考的比较久。但未想到,今天再次做的时候,居然生生用了两个多小时才通过。而且过程中出错的地方不少,可谓非常坎坷。痛定思痛,决定要把这道题的思路记录下来。
看到这道题最先想到的就是双指针+哈希表,双指针用来计算长度,哈希表目的是记录字符值(key)和其所在的下标(value)。遍历字符串运算过程中,如果当前字符值不存在于哈希表中,则更新长度,如果存在,且存在的字符值在哈希表中对应的下标值大于左指针left(因为left的作用是截断重复的字符串前面的所有值,所以下标小于left的值已经被截断了),则让left指向已经存在的字符值的下一位,且不需要更新长度。最后无论是否存在,都要将当前的字符值和下标存入哈希表。并让right指针右移一位。

Java代码描述

public int lengthOfLongestSubstring1(String s) {
	if(s.length() == 0){
	    return 0;
	}
	//初始化左右指针
	int left = 0;
	int right = 1;
	int max = 1;
	HashMap<Character, Integer> hashMap = new HashMap<>();
	hashMap.put(s.charAt(0), 0);
	while (right < s.length()) {
	    //哈希表中存在该值且其下标大于left,也就是说没有被截断
	    if ((hashMap.containsKey(s.charAt(right))) && (hashMap.get(s.charAt(right)) >=left)) {
	        left = hashMap.get(s.charAt(right)) + 1;
	    } else {
	        max = Math.max(max, right - left + 1);
	    }
	    hashMap.put(s.charAt(right), right);
	    right++;
	}
	return max;
	}
	```
	发现自己描述的有点不清不楚...全当自我记录了...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值