爪哇2博客
爪哇2博客

最长子串,无重复字符

在本教程中,我们将在Java中看到查找最长的子字符串而不重复字符。

问题

我们需要找到最长的子字符串而不重复字符

蛮力解决方案

找到所有子串并检查最长子串而不重复字符,但是在这种情况下,时间复杂度将为O(n ^ 3)。


线性时间解决方案

通过使用一些额外的空间,我们可以在线性时间内解决此问题。

这是解决此问题的简单算法:

  • 创建一个访问数组,并使用-1对其进行初始化。该数组将跟踪角色的当前索引。
  • 遍历String并跟踪previousIndex。 previousIndex只是访问数组中索引的值
  • 如果当前字符尚未重复(previousIndex = -1)或不在当前非重复字符String(i– currentLength >previousIndex),然后增加当前索引。
  • 如果当前字符存在于当前非重复字符串String中,则
    • 更新当前长度以从previousIndex的下一个字符开始。
  • 更新已访问数组中当前字符的索引。

爪哇程序查找最长的子字符串而不重复字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
 
进口 爪哇.实用程序.数组;
 
// 爪哇程序查找最长的子字符串而不重复字符
上市 LongestSubstringwithoutRepeatingCharactersMain
{
 
    静态的 最后 整型 NO_OF_CHARS = 256;
 
    静态的 longestUniqueSubstringWRepeatingCharacter( 力量)
    {
        整型 = 力量.长度();
        整型 当前长度 = 1;    //当前子串的长度
        整型 最大长度 = 1;    //结果
        整型 previousIndex=-1;        //  previous index
        整型 i;
         longestSubString=+力量.字符(0);
        整型 参观过[] = 整型[NO_OF_CHARS];
 
        //用-1​​初始化访问数组
        数组.(参观过, -1);
 
        / *通过存储以下内容将第一个字符标记为已访问
             index of first  访问数组中的字符。 * /
        参观过[力量.字符(0)] = 0;
 
        / *从第二个字符开始
          */
        对于(i = 1; i < ; i++) { previousIndex = 参观过[力量.字符(i)]; / * *如果当前字符尚未出现或不是当前字符*非重复字符串,只需增加非重复字符串的长度* * / 如果(previousIndex == -1 || i - 当前长度 > previousIndex)
                当前长度++;
 
            / *如果当前字符存在于当前
              被视为非重复字符串,
              然后更新非重复字符串
              从previousIndex的下一个字符开始。 * /
            其他
            {
                / *在更新非重复字符之前,请检查最大长度* /
                如果(当前长度 > 最大长度)
                {  
                    最大长度 = 当前长度;
                    整型 startIndex=i-当前长度;
                    longestSubString=力量.子串(startIndex,i);
                }
 
                当前长度 = i - previousIndex;
            }
 
            //更新当前字符的索引
            参观过[力量.字符(i)] = i;
        }
 
        //检查最大长度
        如果(当前长度 > 最大长度)
        {
            最大长度 = 当前长度;
            整型 startIndex=i-当前长度;
            longestSubString=力量.子串(startIndex,i);
        }
 
        返回 longestSubString;
    }
 
    / *测试上述功能的驱动程序* /
    上市 静态的 虚空 主要([] args)
    {
         力量 = “ TheJavaTutorial”;
        系统..打印(“输入字符串是”+力量);
 
         longestUniqueSubsttr = longestUniqueSubstringWRepeatingCharacter(力量);
 
        系统..打印(“最长的子字符串,不重复字符:”+longestUniqueSubsttr);
    }
}
 

输出:

输入字符串是TheJavaTutorial
最长子串,不重复字符:vaTutori

那’关于查找最长子串而不重复字符的所有操作。你可以找到更多 爪哇面试程序.

分享这个

作者

关注作者

相关文章

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇2博客