每天都要LeetCode~ Day 3

本文介绍了一种求解字符串中最长无重复子串长度的算法实现,通过使用HashSet存储子串字符,确保子串内字符唯一性。利用左右指针进行遍历,实现了高效的求解。

Longest Substring Without Repeating Characters

刷题的第三天~~ 今天的题目是要求我从一个String中返回不重复的,最长的substring的长度,例如"pwwkew"中最长的不重复substring是"kew"长度为3。

这题思路我的思路比较直接,设置一个代表左边字符的数字left,一个代表遍历String的数字right,以及我们最终要返回的最长不重复substring长度max。我使用了character Set作为储存我substring的容器,让right遍历string,如果set中不包含string中在right位置的字符,则可以将这个字符加入到我的set中。在此过程中不断取max和set的最大值,存入max。一旦遍历过程中的字符重复了,则将set中代表该字符,在left位置的character remove掉。 遍历完成后即可return max作为答案。

class Solution {
    public int lengthOfLongestSubstring(String s) {
    	//定义character set
        HashSet<Character> set = new HashSet<>();
        //代表set左边字符位置的left
        int left = 0;
        //代表遍历string,代表即将加入set的字符位置
        int right = 0;
        //最长的不重复substring的长度
        int max = 0;
        //当遍历string的过程中
        while (right < s.length()){
        	// 如果set中不包含string在right位置的字符
            if(!set.contains(s.charAt(right))){
            	// 则将该字符加入set
                set.add(s.charAt(right));
                // 移动到下一个字符位置
                right++;
                // 取当前max和set的size的最大值放入max作为当前答案
                max = Math.max(max,set.size());
            } else {
            	// 否则代表set中已经存在该字符,重复
            	// 将set中重复的字符删去
                set.remove(s.charAt(left));
                // 移到下一个可能删除的字符
                left++}
        }
        // 返回答案
        return max;
    }
}

今天的题目感觉相对昨天的listnode简单许多,主要考我是否想到使用set来存储。但好像使用int array也是可以的。感觉Java写这种还是稍微麻烦一些,下次试试用脚本语言写。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值