代码练习10---滑动窗口

一、无重复字符的最长子串

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

解题思路

以下是详细的解题思路:

  1. 定义数据结构

    • 一个字典 char_index 用于记录每个字符的最新位置。
    • 两个指针 leftright 分别表示当前窗口的起始和结束位置。
    • 一个变量 max_length 用于记录最长无重复字符子串的长度。
  2. 遍历字符串

    • 使用 right 指针遍历字符串中的每个字符。
    • 对于每个字符 char
      • 如果字符 char 已经在 char_index 中,并且其索引值大于或等于 left,说明当前窗口内存在重复字符。
      • 调整 left 指针的位置为 char_index[char] + 1,以排除重复字符。
    • 更新字符 charchar_index 中的最新位置为 right
    • 计算当前窗口的长度 right - left + 1,并更新 max_length
  3. 返回结果

    • 遍历结束后,max_length 即为最长无重复字符子串的长度。

Python核心代码: 

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        char_index={}
        left = 0
        max_length =0
        for right,char in enumerate(s):
            if char in char_index and char_index[char]>=left:
                left = char_index[char]+1
            char_index[char]=right
            max_length = max(max_length,right-left+1)  
        return max_length      
      

 C++核心代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char,int>charIndex;
        int left =0;
        int maxlength=0;
        for(int right =0;right<s.length();right++){
            char c = s[right];
            if(charIndex.find(c) != charIndex.end() && charIndex[c]>=left){
                left = charIndex[c]+1;
            }
            charIndex[c]=right;
            maxlength = max(maxlength,right-left+1);
        }
        return maxlength;


    }
};

二、找到字符串中的所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

 

解题思路

  1. 初始化

    • 创建两个字符计数器 p_counts_count,分别用于记录字符串 p 和当前窗口内的字符频率。
    • 窗口大小固定为 p 的长度。
  2. 滑动窗口

    • 使用一个滑动窗口遍历字符串 s
    • 每次将新字符加入窗口的右侧,并从窗口的左侧移除字符,保持窗口大小固定。
    • 在每一步,比较窗口内的字符计数 s_countp_count 是否相等。如果相等,说明当前窗口内的子串是 p 的异位词,记录其起始索引。
  3. 结果返回

    • 返回所有异位词子串的起始索引。

Python核心代码: 

class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        result =[]
        p_count = Counter(p)
        s_count = Counter(s[:len(p)-1])
        for i  in range(len(p)-1,len(s)):
            s_count[s[i]] += 1
            if s_count==p_count:
                result.append(i-len(p)+1)
            s_count[s[i-len(p)+1]] -= 1
            if s_count[s[i-len(p)+1]] == 0:
                del s_count[s[i - len(p)+1]]    
        return result        

 

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值