经典面试题:求一个字符串的最长不重复子串

104 阅读1分钟

题目分析:

比如:

给定"abcabcabcbb"的答案是"abc"

给定"120135435"答案是"201354",

看题可以知道其实题目要的只是元素不重复这个是关键点。我的想法就是将给定的字符串转化成数组,找到数组每一项向后找到的不重复的子串。在找到最长的那个就可以了,这样就很简单了。

举个🌰:

   120135435 每一项向后找不重复的子串为 => 120 201354 01354 1354 354 543 435 35 5

代码:

    const str = '120135435';
    const fn = (d = '') => {
      // 将目标值转化为数组
      const arr = d.split('');
      /**
       * number为当前的索引值
       * totalList为记录当前索引往后找的不重复子串的数组
       * AllList是原数组
       * recursion递归函数是用当前索引++的形式进行递归 当totalList中有重复的元素结束递归
       */
      const recursion = (number = 0, totalList, Alllist) => {
        // 当前的值
        const strings = Alllist[number];
        if (!totalList.some((v) => v === strings)) {
          totalList.push(strings);
          const n = number + 1;
          return recursion(n, totalList, Alllist);
        }
        return totalList;
      };
      const newArr = arr.reduce((val, item, index, list) => {
        const text = recursion(index, [], list).join('');
        val.push(text);
        return val;
      }, []);
      // 所有的子串获取到了后使用sort方法对长度进行排序就完成了
      return newArr.sort((a, b) => {
        return b.split('').length - a.split('').length;
      })[0];
    };
    console.log(fn(str));

骐骥一跃,不能十步;驽马十驾,功在不舍