LeetCode-567。文字列の順列-分析とコード(Java)

1.トピック

2つの文字列s1とs2が与えられた場合、s2にs1の順列が含まれているかどうかを判別する関数を記述します。
言い換えると、最初の文字列の順列の1つは、2番目の文字列の部分文字列です。

例1:

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

例2:

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

注意:

  • 入力文字列には小文字のみが含まれます
  • 両方の文字列の長さは[1、10,000]の間です

出典:LeetCode
リンク:https://leetcode-cn.com/problems/permutation-in-string
著作権はLeetCodeが所有しています商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。

2、分析とコード

1.スライディングウィンドウ

(1)考える

文字列の配置の1つは、別の文字列の部分文字列です。つまり、2つは同じタイプと文字数を持っています。
s2にはs1と同じ長さのスライディングウィンドウを設計でき、ウィンドウ内の文字の種類と数がs1と同じかどうかを計算することで、問題の意味を満たす解決策があるかどうかを判断できます。 。

(2)コード

class Solution {
    
    
    public boolean checkInclusion(String s1, String s2) {
    
    
        int len = s1.length(), n = s2.length(), delta = 0;//delta为存在个数差异的字符数量
        if (n < len)
            return false;
        int[] ch = new int[26];
        char[] c1 = s1.toCharArray(), c2 = s2.toCharArray();
        for(char c : c1) {
    
    
            if (ch[c - 'a']++ == 0)
                delta++;
        }
        //初始化滑动窗口
        for (int i = 0; i < len; i++) {
    
    
            switch (ch[c2[i] - 'a']--) {
    
    
                case 0:
                    delta++;
                    break;
                case 1:
                    delta--;
                    break;
            }
        }
        if (delta == 0)
           return true;
        //滑动窗口移动
        for (int i = len; i < n; i++) {
    
    
            switch (ch[c2[i] - 'a']--) {
    
    
                case 0:
                    delta++;
                    break;
                case 1:
                    delta--;
                    break;
            }
            switch (ch[c2[i - len] - 'a']++) {
    
    
                case 0:
                    delta++;
                    break;
                case -1:
                    delta--;
                    break;
            }
            if (delta == 0)
                return true;
        }
        return false;
    }
}

(3)結果

実行時間:3ミリ秒、
すべてのJava送信ユーザーの99.88%を上回っています。メモリ消費量:38.7 MB、すべてのJava送信でユーザーの29.94%を上回っています。

3、その他

何もありません。

おすすめ

転載: blog.csdn.net/zml66666/article/details/113839293