Skip to content

Latest commit

 

History

History
84 lines (67 loc) · 1.84 KB

3.无重复字符的最长子串.md

File metadata and controls

84 lines (67 loc) · 1.84 KB

无重复字符的最长子串

解题思路

滑动窗口

1、遍历整个字符串,通过一个临时集合存入遍历中的子串。

2、通过判断遍历时的元素是否子串内,判断子串是否结束。

3、若子串在遍历中结束,则与最长的长度比较,获取最长子串的长度。

4、若子串在遍历中一直未结束,则整个字符串无重复,字符串长度就是最长子串长度。

性能优化点

1、使用字符串类型存储比数组省内存,拼接也会更快

var lengthOfLongestSubstring = function(s) {
  let list = [];
  /* code */
};
var lengthOfLongestSubstring = function(s) {
  let str = "";
  /* code */
};

2、使用数字类型记录遍历遍历的长度,减少对值长度的引用

var lengthOfLongestSubstring = function(s) {
  let str = "";
  let maxLength = 0;
  const sLength = s.length;
  /* 放在外部,只取一次,避免遍历时反复取 */
  for (let i = 0; i < sLength; i++) {
    /* for 循环在遍历时会反复的执行第二段参数 */
    /* code */
  }
  /* code */
};

性能疑问

1、字符串取下标与字符串的 charAt 方法,哪个更快?

var lengthOfLongestSubstring = function(s) {
  /* code */
  for (let i = 0; i < sLength; i++) {
    /* code */
    // const item = s[i];
    const item = s.charAt(i);
    /* code */
  }
  /* code */
};

2、字符串的 substr 和 slice 哪个更快?

var lengthOfLongestSubstring = function(s) {
  let str = "";
  let maxLength = 0;
  const sLength = s.length;
  for (let i = 0; i < sLength; i++) {
    const strLen = str.length;
    const item = s.charAt(i);
    const index = str.indexOf(item);
    /* code */
    // str = str.substr(index + 1);
    str = str.slice(index + 1);
    /* code */
  }
  return str.length > maxLength ? str.length : maxLength;
};