3. Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
初步解答思路如下:
1、用数组和数组下标记录字符出现的次数,数组下标为字母的ascii码值,默认值为0,出现一次即将值改为1。
2、遍历整个字符数组,找个以其中每个元素为开始的最长字符串,比较它们的长度
综上,该方案时间复杂度为O(n2),代码如下:
public static int lengthOfLongestSubstring(String s) { if (null == s || 0 == s.length()) { return 0; } char[] letters = s.toCharArray(); int[] hashArray = new int[256]; int maxlen = 1; int maxindex = 0; // 遍历已letters[i]为开始的每一个最长字串,比较得到最大长度 for (int i = 0; i < letters.length; i++) { Arrays.fill(hashArray, 0); hashArray[(int) letters[i]] = 1;// 将i以前的部分装入数组 for (int j = i + 1; j < letters.length; j++) { if (0 == hashArray[(int) letters[j]]) { hashArray[(int) letters[j]] = 1;// 遍历中出现过的字母值为1 if (j == letters.length - 1) { if (j + 1 - i > maxlen) { maxlen = j + 1 - i; maxindex = i; } } } else {// 不为0,则表示已开始重复 if (j - i > maxlen) { maxlen = j - i; maxindex = i; } break; } } } System.out.println(s.substring(maxindex, maxindex + maxlen)); return maxlen; }
leetcode提交时请去掉代码中debug用的print语句,不然会极大的影响排名(手动微笑?)