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、その他
何もありません。