1. トピックの説明と要件
トピックの説明
文字列 s と t が与えられた場合、s が t の部分列であるかどうかを判断します。
文字列のサブシーケンスは、残りの文字の相対位置を変更せずに、元の文字列から一部の (またはそうでない) 文字を削除することによって形成される新しい文字列です。(たとえば、「ace」は「abcde」の部分列ですが、「aec」はそうではありません)。
例
例 1:
输入:s = "abc", t = "ahbgdc"
输出:true
例 2:
输入:s = "axc", t = "ahbgdc"
输出:false
ヒント
0 <= s.length <= 100
0 <= t.length <= 10^4
- どちらの文字列も小文字のみで構成されています。
2. 問題解決のアイデア
一般的なアイデア:
まずタイトルを分析します。タイトルでは、指定された 2 つの文字列を判断し、文字列 s が文字列 t の部分列であるかどうかを判断する必要があります。部分列かどうかを判断するには、文字列 s の要素 t がそれを持っているだけで簡単ですが、要素を相対的な順序で組み合わせる必要があることに注意してください。
したがって、ダブル ポインタの方法を使用して、文字列をトラバースするために 2 つの文字列にポインタを設定できます。文字列s を指すポインタ i は、 t で対応する要素が見つかった場合にのみ後方に移動し、それ以外の場合は後方に移動しません。移動します。このことから、文字列 s が文字列 t の部分列でない場合、i は s を最後まで走査できないことがわかります。したがって、i が s の長さに等しいかどうかを判断するだけで済みます。は t の部分列です。文字列 t を指すポインタ j は、トラバースが完了するまで後方に移動します。
具体的な手順:
① 2つの文字列の長さを取得する
②ダブルポインタの定義
③ 要素が等しい場合、ダブル ポインタを使用して 2 つの配列を順番に走査します。
④ iがnに等しいかどうかを判定する
3. 具体的なコード【C言語】
bool isSubsequence(char * s, char * t){
int n = strlen(s), m = strlen(t);//分别获取两个字符串的长度
int i = 0, j = 0;
//以T字符串为参照对象,利用双指针遍历两个数组,获取s与t的相同元素数量,如若与n不相等,则代表不是子序列
while (i < n && j < m) {
if (s[i] == t[j]) { //元素相等时,i向后移动
i++;
}
j++;
}
return i == n;
}