LeetCode Minimal Coverage Substring Java Double Pointer Fenêtre coulissante

Description du titre:

Donnez-vous une chaîne S et une chaîne T. Veuillez concevoir un algorithme qui puisse trouver à partir de la chaîne S dans une complexité temporelle O (n): la plus petite sous-chaîne contenant tous les caractères de T.

Exemple:

输入:S = "ADOBECODEBANC", T = "ABC"
输出:"BANC"

rapide:

如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

Source:
Lien LeetCode : https://leetcode-cn.com/problems/minimum-window-substring

Sujets similaires

Arrangement de cordes

La plus longue sous-chaîne sans répétition

Trouver tous les mots dysphoriques de lettre dans la chaîne

Idées de statistiques de journal
:

1.设left为窗口左边界,right为窗口右边界;

2.我们得找到第一次包含全部目标字符串时,left和
right的位置,不断l++不断缩小窗口的大小,当l变
大时,看此时窗口内所包含的子串是否存在T,如果存
在更新最小值,不存则右边界right继续扩大,并重复
上述步骤;

3.怎么判断left~right之间是否包含T呢?用两个数组
target[]用来记录T中的个个字符出现的次数,
map[]用来记录当left~right中的个个字符出现的次数
并用count来记录是否T中所有的字符都已全部包含;

4.当s.charAt(r),存在于T中且出现次数小于等于
target[s.charAt(r)]时count++,为了避免字符重复出现
  当count==T.length()时
则说明T中所有的字符都已被包含,开始缩小窗口;

5.缩小窗口的时候判断此时窗口是否还包含的T的方法一样
s.charAt(l)存在于T且target[s.charAt(l)]>=
map[s.charAt(l)]时,count--;


* C'est compliqué et je dois le dessiner sur le projet de papier. Je veux aussi préciser que ma force n'est pas autorisée *

Code :

class Solution {
    
    
    public String minWindow(String s, String t) {
    
    
          if (s == null || s == "" || t == null || t == "" || s.length() < t.length()) {
    
    
            return "";
        }
        int length=s.length();
        int map[]=new int[128];
       //int map[]=new int [l28];
        int target[]=new int[128];
        for(int i=0;i<t.length();i++){
    
    
            target[t.charAt(i)]++;
        }
        int left=0;
        int right=0;
        int count=0;
        int anslength=99999;
        String ans="";
        while(right<s.length()){
    
    
            //找到一个区间包含t
            char temp=s.charAt(right);
            map[temp]++;
            //count=t.length()的时候说明全部找到
            //首先这个字母得在t里存在,其次存在的次数不得超过t里的次数
            if(target[temp]>0&&target[temp]>=map[temp]){
    
    
                count++;
            }
        
            //找完了,就缩小左边界
            while(count==t.length()){
    
    
           
                char temp2=s.charAt(left);
                //看这个字符是否存在,其次存在的次数如果开始小于等于t里
                //的时候就要开始注意了不能再减了,举个例子C此时窗口里
                //BBAC 而T=BAC,则此时的map[B]=2,target[B]=1,可以减一次
                if(target[temp2]>0&&target[temp2]>=map[temp2])
                count--;
                if(right-left+1<anslength){
    
    
                    anslength=right-left+1;
                    ans = s.substring(left, right + 1);
                   // res=s.substring(left,right+1);
                }
                map[temp2]--;
                left++;
            }
            right++;
        }
        return ans;
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_44844588/article/details/108149928
conseillé
Classement