首页 > 其他分享 >剑指 Offer II 017. 含有所有字符的最短字符串

剑指 Offer II 017. 含有所有字符的最短字符串

时间:2023-04-25 20:36:36浏览次数:44  
标签:右移 字符 cnt Offer len II 017 字符串 指针

题目链接:剑指 Offer II 017. 含有所有字符的最短字符串

方法:同向双指针

解题思路

  • 基本思路:统计 \(t\) 字符串中每个字符的个数,然后使用双指针遍历字符串 \(s\),当窗口覆盖 \(t\) 中所有字符时,开始缩短左指针到可以到达的最右侧,取窗口最小的字符串为答案;
  • 需要考虑的问题:
    • 什么情况下表明当前窗口覆盖了 \(t\) 中所有字符?
       由于 \(t\) 中的字符可能重复,可以设置一个变量 \(k\) 表示 \(t\) 中不重复的字符个数,在右指针右移的过程中当某个字符的个数减小为 \(0\) 时,表明当前窗口已经包含当前字符的所有重复字符,此时将 \(k - 1\) ,当 \(k == 0\) 时,表明已经完全覆盖。
    • 左指针可以右移的条件?
      • 若当前左指针指向的字符数量为负数,有两种可能:
        • 当前字符不在 \(t\) 字符串中,直接跳过即可,\(l + 1\);
        • 当前字符在 \(t\) 字符串中,但是当前窗口中该字符的数量超过了 \(t\) 字符串中该字符的数量,也可以跳过,\(l + 1\)。
    • 答案何时更新?
       应该在左指针右移停止后。设答案字符串的起始为 \(idx\),长度为 \(len\),当 \(r - l > len\) 时,更新 \(idx = l\),\(len = r - l\)。
  • 注意:在此过程中 \(k\) 变量只在第一次使得窗口覆盖 \(t\) 字符串的过程中起作用,因为覆盖之后,右指针仍继续右移,并且左指针的移动,也确保了当前窗口在左指针右移之后仍然覆盖 \(t\) 字符串。

代码

class Solution {
public:
    string minWindow(string s, string t) {
        int n = s.length(), m = t.length();
        if (n < m) return "";
        int cnt['z' + 1] = {0}, k = 0;
        for (auto &c : t) {
            cnt[c] ++ ;
            if (cnt[c] == 1) k ++ ;
        }
        int l = 0, r = 0, idx = 0, len = n;
        while (r < n) {
            char c = s[r ++ ];
            cnt[c] -- ;
            if (cnt[c] == 0) k -- ;
            if (k == 0) {
                while (l < r && cnt[s[l]] < 0) {
                    cnt[s[l]] ++ ;
                    l ++ ;
                }
                if (l == r || r - l < len) {
                    idx = l;
                    len = r - l;
                }
            }
        }
        return k != 0 ? "" : s.substr(idx, len);
    }
};

复杂度分析

时间复杂度:\(O(n)\);
空间复杂度:\(O(1)\)。

标签:右移,字符,cnt,Offer,len,II,017,字符串,指针
From: https://www.cnblogs.com/lxycoding/p/17353708.html

相关文章

  • 分治算法:剑指 Offer 25. 合并两个排序的链表
    题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 限制:0<=链表长度<=1000 解题思路:    classSolution{publicListNodemergeTwoLists(ListNodel1,ListNodel2){ListNodedum=newListNode......
  • 【DP】LeetCode 213. 打家劫舍 II
    题目链接213.打家劫舍II思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(即n......
  • Java代码虾皮item_search-根据关键词获取商品列表 API 接口(title商品标题、pic_url宝
     Shopee是东南亚最大的电商平台之一。Shopee拥有商品种类,包括电子消费品、家居、美容保健、母婴、服饰及健身器材等。做好shopee店铺需要注意以下几点:1.选择优质的产品2.每日上新产品3.营销策略4.引流策略5.发货的地点Java代码操作示例importjava.io.BufferedReader;impo......
  • COMP2017 C语方系统分析
    COMP20179017Assignment3Thisassignmentisworth5%+10%+30%ofyourfinalassessmentThisassessmentisCONFIDENTIAL.©UniversityofSydney.Due:•Milestone:23:59Wednesday26April2023localSydneytime.•Final:23:59Tuesday9May2023localSydn......
  • 剑指 Offer 55 - II. 平衡二叉树
    剑指Offer55-II.平衡二叉树输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例1:给定二叉树[3,9,20,null,null,15,7]3/\920/\157返回true。示例2:......
  • 剑指 Offer 10- II. 青蛙跳台阶问题
    分析:因为好久没有练习思维还没有转变,所以这道题思考有点慢首先还是建立状态,到达第i级台阶时,有f[i]种跳法最后答案f[n-1]再状态转移,f[i]=f[i-1]+f[i-2] 赋初值,因为可以选择跳一阶或者两阶,所以初始赋值f[0]和f[1],f[0]=1,f[1]=2然后编写代码,但是最后有个问题,不知道1e9+7不是......
  • 剑指 Offer II 088. 爬楼梯的最少成本
    剑指OfferII088.爬楼梯的最少成本-力扣(LeetCode)分析:先思考建立状态。到达第i阶台阶时,花费最少体力为f[i]。再状态转移,到达i时有两种选择,从i-1或者i-2到i,两者取最小的再加上i需要花费的体力cost[i]。结果f[-1]最后得出状态转移:f[i]=min(f[i-1],f[i-1])+cost[i]......
  • 2017 ACM-ICPC, Universidad Nacional de Colombia Programming Contest D
    AlexhastwomagicmachinesAandB.MachineAwillgiveyou2x + 1coinsifyouinsertxcoinsinit,machineBwillgiveyou2x + 2.Alexhasnocoinsandwantstogetexactlyncoinsinordertobuyanewunicorn,buthecan’tfigureouthowtodoi......
  • ECNA 2017 Problem J: Workout for a Dumbbell 模拟
    JimRatthasjustjoinedalocalfitnesscenter.He’sespeciallyexcitedaboutasequenceof10machinesthathecyclesthroughthreetimesforhisworkout.Hehasafixedtimewhichhespendsoneachmachine,aswellasafixedrecoverytimeafterusin......
  • 2017ACM/ICPC广西邀请赛-重现赛(感谢广西大学)C - Counting Stars 暴力三元环
    LittleAisanastronomylover,andhehasfoundthattheskywassobeautiful!Soheiscountingstarsnow!Therearenstarsinthesky,andlittleAhasconnectedthembymnon-directionaledges.Itisguranteedthatnoedgesconnectonestarwithi......