3. Longest Substring Without Repeating Characters解法

本文探讨了两种求解最长无重复子串的算法实现。一种是基于HashSet的方法,通过遍历字符串并利用集合特性来识别重复字符,计算最长无重复子串长度;另一种则采用队列数据结构,优化了重复字符的处理过程,提高了算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己写的:
public static int lengthOfLongestSubstring(String s) {
		int max = 0; //如果字符串长度为0 直接返回长度0
		char[] c = s.toCharArray();
		Set<Character> set = new HashSet<>(); //利用Set中不能含有相同元素的性质
		for (int i = 0; i < c.length; i++) {  //遍历字符串中的每一个字符

			if (!set.add(c[i])) {     //每次都会判断set中是否已经有了该字符,没有 就添加进去,有就计算set中字符的个数
				max = Math.max(max, set.size()); //与最大长度比较 取大的赋给最大长度
				set.clear(); //清空set
				for (int j = i; j > 0; j--) {  //从该重复元素下标往前 遍历
					// 将字符重新存入set中,直至遇到与自己重复的为止 相当于开始一个新的长度计数,再继续遍历字符串的下一个元素
					if (!set.add(c[j])) break;
				}
			}
			//这个主要针对字符串中所有元素都不重复的现象
			max = Math.max(max, set.size());
		}
		return max;
	}

discuss里面的解法:
	public static int lengthOfLongestSubstring1(String s) {
    //主要利用队列先进先出的性质 快速解决了上述方法中第二个for循环所解决的问题
	Queue<Character> queue = new LinkedList<>();
	int max = 0;
	//遍历字符串中的字符元素
		for (char c : s.toCharArray()) {
			//如果遇到重复元素,从queue中第一个元素开始移除 直至不含有重复元素
		while (queue.contains(c)) {
			queue.remove();
		}
		//不含有重复元素 向queue中添加字符
		queue.add(c);
		max = Math.max(max, queue.size()); //每次比较长度
	}
		return max;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值