题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
1 2 3
| 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
|
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的题解
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
| class Solution { public int lengthOfLongestSubstring(String s) { int max=0; int cnt=0; int a=0,b=0; for(int i=0;i<s.length();i++) { a=i; cnt=0; for(int k=i;k<s.length();k++) { b=k; if(k>i&&s.substring(a,b).contains(s.charAt(k)+"")) { cnt=1; a=b; } else { cnt++; } max=Math.max(max,cnt); } if(max>=s.length()-i) { break; } } return max; } }
|
问就是直接暴力,不过很显然大数据不行!!!
大神题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public int lengthOfLongestSubstring(String s) { int n = s.length(), ans = 0; Map<Character, Integer> map = new HashMap<>(); for (int end = 0, start = 0; end < n; end++) { char alpha = s.charAt(end); if (map.containsKey(alpha)) { start = Math.max(map.get(alpha), start); } ans = Math.max(ans, end - start + 1); map.put(s.charAt(end), end + 1); } return ans; } }
|
作者:guanpengchn
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/solution/hua-jie-suan-fa-3-wu-zhong-fu-zi-fu-de-zui-chang-z/
这种解法的主要思想是用hashmap记录串中每个字母出现的最后一个位置,当出现重复的字母时就更新start的值,下次不重复的串的长度就从start开始记录,一开始start记录为零,要小心算法中加一减一的关系。还有一种优化的算法,将哈希表改为数组来存储。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public int lengthOfLongestSubstring(String s) { int n = s.length(), ans = 0; int[] index = new int[128]; for (int j = 0, i = 0; j < n; j++) { char c = s.charAt(j);
i = Math.max(index[c], i); index[c] = j + 1; ans = Math.max(ans, j - i + 1); } return ans; } }
|
力扣官方推荐答案。
该算法用数组下标作为key,里面的值存储作为value,进一步提升了程序的效率。