一.算法题
- 题目
Given a string, find the length of the longest substring without repeating characters.
- Example
- 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
- Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
二.算法题解读
-
题目大意:给定一个字符串,找出不含有重复字符的最长子串的长度
-
解读Example
- 给定"abcabcbb",没有重复字符的最长子串是"abc",那么长度就是3
- 给定"bbbbb",最长子串就是"b",长度就是1
- 给定pwwkew,最长子串就是"wke",长度为3,
- ==注意,==必须是一个子串."pwke",是子序列,而不是子串
三.优化"滑动窗口"解决思路
到底如何在滑动窗口方法上优化了? 实际上我们可以如果采用进一步优化,可以达到只需要N次即可计算成功.我们可以定义字符到索引映射.而不是使用集合来判断这个字符的存在与否.当遇到重复的字符时,我们即可跳过该滑动窗口.
也可以理解为,如果s[j]在[i,j)的范围内有与j'重复的字符.我们不需要逐渐增加i.而是直接跳过[i,j']范围内的所有元素.并将i变成为j'+1就可以做到.
四.代码实现
java code
public class Solution { public int lengthOfLongestSubstring(String s) { int n = s.length(), ans = 0; //获取当前字符索引 Map<Character, Integer> map = new HashMap<>(); //修改[i,j]的范围 for (int j = 0, i = 0; j < n; j++) { if (map.containsKey(s.charAt(j))) { i = Math.max(map.get(s.charAt(j)), i); } ans = Math.max(ans, j - i + 1); map.put(s.charAt(j), j + 1); } return ans; } }
五.使用ASCII 128码 思路
字符串,其实由字符构成.而字符则可以用ASC码来替代.如此,我们可以用整数数组作为直接访问表来替换Map.
常用表如下:
int [26],用于表示字母 "a" - "z" 或 "A" - "Z";
int [128],用于表示ASCII码
int [256],用于表示扩展ASCII码
A = 65, a = 97
六.代码实现
java code
public 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++) { i = Math.max(index[s.charAt(j)], i); ans = Math.max(ans, j - i + 1); index[s.charAt(j)] = j + 1; } return ans; } }
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:642363427不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!原文地址:https://www.jianshu.com/p/95757ecef8d1