1047-文字列内の隣接するすべての重複を削除します

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;
}

おすすめ

転載: blog.csdn.net/qq_36439722/article/details/112061973