1.タイトルの説明
小文字で構成される文字列Sが与えられると、重複削除操作は2つの隣接する同一の文字を選択し、それらを削除します。
削除できなくなるまで、Sで重複排除操作を繰り返します。
すべての重複排除操作が完了すると、最後の文字列が返されます。答えはユニークであることが保証されています。
例:
入力: "abbaca"
出力: "ca"
説明:
たとえば、 "abbaca"では、 "bb"を削除できます。2つの文字が隣接していて同じであるため、で削除できる重複アイテムはこれだけです。今回。その後、重複排除操作を実行できる「aa」のみが含まれる文字列「aaca」を取得するため、最終的な文字列は「ca」になります。
出典:LeetCode(LeetCode)
リンク:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string
著作権はLeetCodeが所有しています。商用転載の場合は、公認機関にご連絡ください。非商用転載の場合は、出典を明記してください。
2.解決策
- アイデア:スキャンされた配列スペースをスタックとして扱い、スタックの一番上のデータをスキャンされているデータと比較し、スタックの一番上のデータが同じ場合はポップし、スキャンされているデータをスタックにプッシュします異なっています。
- 複雑さの分析:空間の複雑さO(1)、時間の複雑さO(n)。
- コードは次のように実装されています
char * removeDuplicates(char * S){
int i,j;//i为栈指针,j指向当前扫描数据
for(i=0,j=1;S[j]!='\0';j++)
{
if(i>=0)//与栈顶数据比较
{
if(S[i]==S[j])//相同
{
i--;
}
else//不同
{
S[++i]=S[j];//将后一个数据入栈
}
}
else//栈中已无数据,补充
{
S[++i]=S[j];
}
}
S[i+1]='\0';
return S;
}