无重复的最长字串

📝个人主页:五敷有你

🔥系列专栏:算法分析与设计

⛺️稳中求进,晒太阳

问题

给定一个字符串,我们需要找到该字符串中的最长无重复子串的长度。

示例

让我们以一个具体的示例来说明这个问题:

输入: "abcabcbb"
输出: abc
解释: 最长无重复子串是 "abc",它的长度为 3。

解决思路

为了解决这个问题,我们可以使用滑动窗口和哈希表的方法。具体步骤如下:

  1. 我们使用两个指针来构建一个滑动窗口,表示当前无重复子串的范围。初始时,左指针和右指针都指向字符串的开头。
  2. 右指针向右移动,每次移动一个位置,直到找到一个重复字符或者到达字符串的末尾。
  3. 当遇到重复字符时,我们更新左指针的位置,将其移动到重复字符的下一个位置,确保滑动窗口内的字符都是不重复的。
  4. 在遍历过程中,我们使用哈希表来存储每个字符的最新位置,以便在发现重复字符时能够快速更新左指针的位置。
  5. 在每次移动右指针时,我们都更新最长无重复子串的长度。

代码实现

下面是用Java编写的实现代码:

java 复制代码
int lengthOfLongestSubstring(char* s) {

	if (s == NULL)
		return 0;

	int len = strlen(s);
	char* tmp = (char*)calloc(len, 1);
	int right = 0; // 当前字符串长度
	int left = 0; // 控制子串起始位置
	int maxlength = 0; // 记录最长长度

	for (int i = 0; i < len; i++)
	{
		char* p = strchr(tmp + left, s[i]);//这里需要注意的一点是字符必须先判断后复制

		tmp[right] = s[i];
		right++;

		if (p) // 如果该字符已存在,就跳到前面重复字符的下一个位置
		{
			left = p - tmp + 1;
		}

		int curlength = right - left; // 当前子串长度
		if (maxlength < curlength)// 找最长
		{
			maxlength = curlength;
		}
	}

	free(tmp);

	return maxlength;
}

运行结果

结论

通过使用滑动窗口和哈希表的方法,我们能够高效地解决寻找最长无重复子串的问题。这种方法的时间复杂度是 O(n),其中 n 是输入字符串的长度。我们的解决方案在处理大量数据时表现良好,能够在短时间内找到最长无重复子串,并返回其长度。

相关推荐
夏幻灵2 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码2 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
bkspiderx4 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
代码什么用4 小时前
Spring基础使用
java·后端·spring
程序员老陆4 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光4 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
Su米苏4 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
码云数智-园园4 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
老板一杯拿铁4 小时前
Java 异常体系详解:从字节码原理到最佳实践
java
蜗牛互联网5 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端