📌  相关文章
📜  Javascript程序查找最长子字符串的长度而不重复字符

📅  最后修改于: 2022-05-13 01:57:08.875000             🧑  作者: Mango

Javascript程序查找最长子字符串的长度而不重复字符

给定一个字符串str ,找出不重复字符的最长子字符串的长度。

  • 对于“ABDEFGABEF”,最长的子串是“BDEFGA”和“DEFGAB”,长度为6。
  • 对于“BBBB”,最长的子串是“B”,长度为 1。
  • 对于“GEEKSFORGEEKS”,下图中显示了两个最长的子串,长度为 7

所需的时间复杂度为 O(n),其中 n 是字符串的长度。

方法1(简单:O(n 3 )) :我们可以一一考虑所有子字符串,并检查每个子字符串是否包含所有唯一字符。将有 n*(n+1)/2 个子串。一个子串是否包含所有唯一字符,可以通过从左到右扫描它并保持一个已访问字符的映射在线性时间内检查。该解决方案的时间复杂度为 O(n^3)。

Javascript


Javascript


Javascript


输出
The input string is geeksforgeeks
The length of the longest non-repeating character substring is 7

方法2(更好:O(n 2 ))这个想法是使用窗口滑动。每当我们看到重复时,我们都会删除前一次出现并滑动窗口。

Javascript


输出
The input string is geeksforgeeks
The length of the longest non-repeating character substring is 7

方法4(线性时间) :现在让我们谈谈线性时间解决方案。此解决方案使用额外空间来存储已访问字符的最后索引。这个想法是从左到右扫描字符串,跟踪迄今为止在res中看到的最大长度非重复字符子字符串。当我们遍历字符串时,要知道当前窗口的长度,我们需要两个索引。
1)结束索引( j ):我们将当前索引视为结束索引。
2)起始索引( i ):如果当前字符不存在于前一个窗口中,则与前一个窗口相同。为了检查当前字符是否出现在前一个窗口中,我们将每个字符的最后一个索引存储在数组lasIndex[]中。如果 lastIndex[str[j]] + 1 大于先前的开始,那么我们更新了开始索引 i。否则我们保持相同的 i。

以下是上述方法的实现:

Javascript


输出
The input string is geeksforgeeks
The length of the longest non-repeating character substring is 7

时间复杂度: O(n + d),其中 n 是输入字符串的长度,d 是输入字符串字母表中的字符数。例如,如果字符串由小写英文字符组成,则 d 的值为 26。
辅助空间: O(d)

有关详细信息,请参阅有关最长子串长度的完整文章,而不重复字符!