最长子串,无重复字符
在本教程中,我们将在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
那’关于查找最长子串而不重复字符的所有操作。你可以找到更多 爪哇面试程序.