15天算法入门(六)

简介: 本文主要讲无重复字符的最长子串和字符串的排列

网络异常,图片无法展示
|


网络异常,图片无法展示
|


无重复字符的最长子串


题目


给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

 

示例 1:
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
复制代码


题解


该题考察了字符串的一些用法(字符串截取、查找)。在遍历过程中,通过当前字符与前面无重复子字符串比较:


  • 当前字符存在子串中,将子串左边界收缩到重复的下一位值;
  • 不重复,则右边界继续扩大。


关于最大值,比较子串出现的最大长度。

例子:

s = "abcabcbb"

当开始时,子串的左右边界应该指向起始位置。当前截取的子串str应该为空。

网络异常,图片无法展示
|
子串str中不包含当前a字符,所以,扩大子串右边界,继续向下遍历。

当循环到第二个a时,情况如下:

网络异常,图片无法展示
|

此时截取的子串中包含了当前的字符,进行查找子串中出现重复的位置,将缩小左边界至重复位置的下一位。继续循环,取最大值。

网络异常,图片无法展示
|

当再次出现重复时:

网络异常,图片无法展示
|
依旧缩小左边界。在此,p1并不是简单的移动到子串重复位置的下一位。当前子串重复位置为0,下一位即1。但是如果移动到1的话,左边界就并未缩小。所以移动的时候,还需要加上左边界原始的位置。此时p1移动到2位置。 以此类推,在每次遍历中,取子串长度的最大数。最后遍历完成后,返回最大值即可。


代码


var lengthOfLongestSubstring = function (s) {
    let p1 = 0, index = 0, max = 0
    while (index <= s.length) {
        let str = s.slice(p1, index)
        let isExitIndex = str.indexOf(s[index])
        if (isExitIndex > -1) p1 += isExitIndex + 1
        max = Math.max(max, str.length)
        index++
    }
    return max
};


字符串的排列


题目


给你两个字符串 s1s2 ,写一个函数来判断 s2 是否包含 s1 ****的排列。

换句话说,s1 的排列之一是 s2子串

示例 1:
输入: s1 = "ab" s2 = "eidbaooo"
输出: true
解释: s2 包含 s1 的排列之一 ("ba").


题解


该题主要考察通过子串全排列能否联想到使用字符数组解决。说实话一开始我是没想到。。。


使用两个长度为26的数组,分别记录两个字符串每个字符出现的次数。用一个长度为26的数组记录s1中出现的次数。在遍历s2时,通过使用两个左右指针截取s2可能的子串。在用一个长度为26的数组记录截取的子串字符数。当s1的数组等于截取子串数组时就满足条件。


代码


var checkInclusion = function (s1, s2) {
    let arr1 = new Array(26).fill(0)
    let arr2 = new Array(26).fill(0)
    for (let i = 0; i < s1.length; i++) {
        arr1[s1[i].charCodeAt() - 'a'.charCodeAt()]++
    }
    let i = 0, j = 0
    while (i < s2.length) {
        arr2[s2[i].charCodeAt() - 'a'.charCodeAt()]++
        while (j <= i && arr2[s2[j].charCodeAt() - 'a'.charCodeAt()] > arr1[s2[j].charCodeAt() - 'a'.charCodeAt()]) {
            arr2[s2[j].charCodeAt() - 'a'.charCodeAt()]--
            j++
        }
        i++
        if (arr1.join('') === arr2.join('')) return true
    }
    return false
};


题目来源:leetcode

目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
本文全面介绍了人工智能(AI)的基础知识、操作教程、算法实现及其在实际项目中的应用。首先,从AI的概念出发,解释了AI如何使机器具备学习、思考、决策和交流的能力,并列举了日常生活中的常见应用场景,如手机助手、推荐系统、自动驾驶等。接着,详细介绍了AI在提高效率、增强用户体验、促进技术创新和解决复杂问题等方面的显著作用,同时展望了AI的未来发展趋势,包括自我学习能力的提升、人机协作的增强、伦理法规的完善以及行业垂直化应用的拓展等...
148 3
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
|
2月前
|
机器学习/深度学习 数据采集 人工智能
机器学习算法入门与实践
【7月更文挑战第22天】机器学习算法入门与实践是一个既充满挑战又极具吸引力的过程。通过掌握基础知识、理解常见算法、注重数据预处理和模型选择、持续学习新技术和参与实践项目,你可以逐步提高自己的机器学习技能,并在实际应用中取得优异的成绩。记住,机器学习是一个不断迭代和改进的过程,保持好奇心和耐心,你将在这个领域走得更远。
|
2月前
|
消息中间件 存储 算法
实战算法的基础入门(2)
实战算法的基础入门
|
2月前
|
算法 大数据
实战算法的基础入门(1)
实战算法的基础入门
|
1月前
|
存储 算法
【C算法】编程初学者入门训练140道(1~20)
【C算法】编程初学者入门训练140道(1~20)
|
2月前
|
算法 Java
实战算法的基础入门(3)
实战算法的基础入门
|
3月前
|
算法 程序员
高阶算法班从入门到精通之路
高阶算法班从入门到精通之路
30 3
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习算法入门:从K-means到神经网络
【6月更文挑战第26天】机器学习入门:从K-means到神经网络。文章涵盖了K-means聚类、逻辑回归、决策树和神经网络的基础原理及应用场景。K-means用于数据分组,逻辑回归适用于二分类,决策树通过特征划分做决策,神经网络则在复杂任务如图像和语言处理中大显身手。是初学者的算法导览。
|
3月前
|
自然语言处理 算法
ransformers从入门到精通:常用的subword tokenizer算法
- WordPiece、BPE/BBPE最小字词进行合并最终字词,BPE/BBPE直接采用词频判断合并规则而WordPiece采用最大似然的方式 - unigram采用从最大的字词集合里移除那些对语料库整体概率贡献最小的子词【6月更文挑战第7天】
75 3
|
3月前
|
存储 自然语言处理 算法
位运算入门及简单算法题的应用
位运算入门及简单算法题的应用
26 1