Arreglo de cadenas LeetCode Doble puntero de ventana deslizante Java

Descripción del Título

Dadas dos cadenas s1 y s2, escriba una función para determinar si s2 contiene la permutación de s1.

En otras palabras, una de las permutaciones de la primera cadena es una subcadena de la segunda cadena.

Ejemplo 1:

输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").

Ejemplo 2:

输入: s1= "ab" s2 = "eidboaoo"
输出: False

Temas similares

Subcadena más larga sin repetición

Encuentra todas las palabras disfóricas de letras en la cadena

Subcadena de cobertura mínima

Estadísticas de registro

Ideas

这题我觉得就是 “ 找到字符串中所有字母异位词”和
“无重复最长子串” 的结合;
1.left和right分别为滑动窗口的左右边界,用target
数组记录目标字符串的每个字母的出现次数,用map数组
记录当前left~right中s2中每个字符出现的次数;

2.如果滑动窗口中出现了s1中没有出现过的字符或者出
现字符的次数比s1中的多的时候,就把这个字符踢掉,
换句话说就是缩小滑动窗口即l++3.当(l-r==s1.length())的时候,就是答案,因为滑动窗口已经把多余的字符或者没出现过的字符全部去除了;

Código:

class Solution {
    
    
    public boolean checkInclusion(String s1, String s2) {
    
    
        int length1=s1.length();
        int length2=s2.length();
        if(length1>length2)return false;
        char arr1[]=s1.toCharArray();
        char arr2[]=s2.toCharArray();
        int target[]=new int[128];
        int map[]=new int[128];
        int l=0;
        int r=0;
        for(int i=0;i<length1;i++){
    
    
            target[arr1[i]]++;
            }
        while(r<length2){
    
    
            char temp1=arr2[r];
            r++;
            map[temp1]++;
            while(map[temp1]>target[temp1]){
    
    
                char temp2=arr2[l];
                map[temp2]--;
                l++;
            }
            if(r-l==length1)
            return true;
        }
        return false;
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_44844588/article/details/108157026
Recomendado
Clasificación