438. 找到字符串中所有字母异位词

 

思路:

  • 字符频率统计:使用一个大小为 26 的数组统计目标字符串 p 中每个字符的出现次数。

  • 滑动窗口:在字符串 s 上使用滑动窗口技术,遍历每个字符并调整窗口边界以保持与 p 相同的字符频率。

  • 频率调整:每当窗口右边界增加一个字符时,减少该字符在频率数组中的计数;如果频率数组中某个字符的计数为负数,表示窗口包含了额外的字符,因此需要从左边界开始移除字符,直到该字符的计数恢复到非负状态。

  • 检查子串长度:每次调整窗口后,检查窗口的长度是否与 p 的长度相等。如果相等,则当前窗口就是一个有效的字母异位词,记录其起始索引。

  • 返回结果:最终返回所有满足条件的起始索引。

图解:

代码(Rust) 

impl Solution {
    pub fn find_anagrams(s: String, p: String) -> Vec<i32> {
        let mut arr = [0;26];
        let chars_: Vec<char> = p.chars().collect();
        let chars: Vec<char> = s.chars().collect();

        let mut target :Vec<i32> = Vec::new();

        // 统计目标字符出现次数
        for c in chars_{
            arr[c as usize - 'a' as usize] += 1;
        }

        let mut left:usize = 0;

        for right in 0..s.len(){
            arr[chars[right] as usize - 'a' as usize] -= 1;
            while arr[chars[right] as usize - 'a' as usize] <= -1{
                arr[chars[left] as usize - 'a' as usize] += 1;
                left += 1;
            }
            if (right - left + 1) == p.len(){
                target.push(left as i32);
            }

        }
        return target;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值