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

1.题目描述

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

示例 1:

复制代码
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

示例 2:

复制代码
输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

2.解题思路

先把p字符串排序,可以用vector自带的sort函数,然后对主字符串循环,每次遍历size大小个字符,遍历n次,每次遍历的操作:先把窗口内的字符排序,然后一次和p字符串对比即可。

3.代码

下面先给一些用到的函数

1.string temp = s.substr(i, wnd_size);//截取字符串s,下标从i开始,截取wnd_size个字符赋值给temp;

2.sort(temp.begin(), temp.end());

cpp 复制代码
 vector<int> findAnagrams(string s, string p) {
        
        vector<int> res;
        int wnd_size = p.size();
        if(wnd_size>s.size()){
            return res;
        }
        int i = 0;
        sort(p.begin(),p.end());
        while(i<=s.size()-wnd_size){
            // 截取当前窗口的子串(避免修改原s)
            string temp = s.substr(i, wnd_size);
            // 对窗口子串排序(左闭右开,范围是[0, wnd_size))
            sort(temp.begin(), temp.end());
           
            int j=0;
            while(j<wnd_size){//对比字符是否完全一致
                if(temp[j]!=p[j]){
                    break;
                }
                if(j==wnd_size-1){
                    res.push_back(i);
                }
                j++;
            }
           i++;
        }
        return res;
    }
};

虽然说是On方的时间复杂度,AC不了,但是个人认为我写的代码比官方好理解也更加适合普通人。

相关推荐
1104.北光c°1 小时前
滑动窗口HotKey探测机制:让你的缓存TTL更智能
java·开发语言·笔记·程序人生·算法·滑动窗口·hotkey
仰泳的熊猫5 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
无极低码8 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发8 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
Thera7779 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
罗超驿9 小时前
独立实现双向链表_LinkedList
java·数据结构·链表·linkedlist
superior tigre9 小时前
22 括号生成
算法·深度优先
君义_noip10 小时前
信息学奥赛一本通 1952:【10NOIP普及组】三国游戏 | 洛谷 P1199 [NOIP 2010 普及组] 三国游戏
c++·信息学奥赛·csp-s
努力也学不会java10 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试