[算法][力扣3]无重复字符的最长子串
给定一个字符串 s 请你找出其中不含有重复字符的 最长 子串 的长度。示例 1:输入: s abcabcbb输出: 3解释: 因为无重复字符的最长子串是 abc所以其长度为 3。注意 bca 和 cab 也是正确答案。示例 2:输入: s bbbbb输出: 1解释: 因为无重复字符的最长子串是 b所以其长度为 1。示例 3:输入: s pwwkew输出: 3解释: 因为无重复字符的最长子串是 wke所以其长度为 3。请注意你的答案必须是 子串 的长度pwke 是一个子序列不是子串。如何判断下一个元素和当前子串没有重复元素呢我们可以使用一个数组这个数组一共有125个位置freq[k]存储的anscal为k相应的字符他在子串中出现的评率如果为0就是没有重复为1就是重复了字母对应的数字如下int a a; // 97int z z; // 122int A A; // 65int Z Z; // 90写法一使用数组记录窗口public class Test02_3_2 { public static void main(String[] args) { test01(); } private static void test01() { int ret lengthOfLongestSubstring(abcdddd); System.out.println(ret); } public static int lengthOfLongestSubstring(String s) { if (s null || s.equals()) { return 0; } int left 0; int right 0; int maxLen 1; int[] window new int[128]; window[s.charAt(0)] 1; while (left s.length()) { maxLen Math.max(maxLen, right - left 1); if (right 1 s.length() window[s.charAt(right 1)] 0) { window[s.charAt(right 1)] 1; right; } else { window[s.charAt(left)] 0; left; } } return maxLen; } }写法二使用set记录窗口中不重复的元素效率会低一些public class Test02_0001 { public static void main(String[] args) { int ret lengthOfLongestSubstring(bbbbb); System.out.println(ret); } public static int lengthOfLongestSubstring(String s) { // 边界条件判断 if (s null || s.length() 0) { return 0; } // 初始化指针 int left 0; int right 0; int maxSubArrLength 1; // 窗口 SetCharacter window new HashSet(); window.add(s.charAt(0)); while (left s.length()) { maxSubArrLength Math.max(maxSubArrLength, window.size()); if (right 1 s.length() !window.contains(s.charAt(right 1))) { // 窗口右移 window.add(s.charAt(right 1)); right; } else { // 遇到重复元素窗口左移 // 右边指针无法再移动窗口左移 window.remove(s.charAt(left)); left; } } return maxSubArrLength; } }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2411615.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!