Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 문자열 II의 모든 인접 중복 제거

<시간/>

문자열 s가 주어지면 k 중복 제거는 문자열 s에서 k개의 인접하고 동일한 문자를 선택하고 삭제된 부분 문자열의 왼쪽과 오른쪽이 함께 연결되도록 하는 제거로 구성됩니다. 우리는 남은 것을 변경할 수 없을 때까지 주어진 문자열 s에서 k개의 중복 제거를 반복적으로 수행합니다. 이러한 모든 중복 제거가 수행된 후 최종 문자열을 찾아야 합니다. 따라서 입력이 s ="deeedbbcccbdaa" 및 k =3과 같으면 출력은 "aa"가 됩니다. 처음에는 "eee"와 "ccc"를 삭제하고 "ddbbbaa"를 얻은 다음 "bbb"를 삭제합니다. , 문자열은 "dddaa"가 되고 "ddd"는 삭제되고 출력은 "aa"가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • ans :=빈 문자열
  • char-int 쌍에 대해 하나의 스택 생성, n :=문자열 크기
  • 0~n
      범위의 i에 대해
    • x :=s[i]
    • 스택이 비어 있지 않고 스택 맨 위 요소의 정수 =k인 경우 스택에서 맨 위 요소를 삭제합니다.
    • i =n이면 중단
    • 스택이 비어 있거나 스택 맨 위의 문자가 x가 아니면 스택에 (x, 1) 쌍을 삽입하고 i를 1만큼 증가시킵니다.
    • 그렇지 않으면 스택 상단 요소의 정수 부분을 늘리고 i를 1만큼 늘립니다.
  • 스택이 비어 있지 않은 동안
    • temp :=스택 상단 요소
    • temp의 정수 부분이 0이 아닌 동안
      • ans :=ans + temp의 문자 부분
      • temp의 정수 부분을 1만큼 감소
    • 스택에서 최상위 요소 삭제
  • as 문자열을 뒤집고 반환합니다.

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string removeDuplicates(string s, int k) {
      string ans = "";
      stack < pair<char, int> > st;
      int n = s.size();
      for(int i = 0; i <= n;){
         char x = s[i];
         if(!st.empty() && st.top().second == k)st.pop();
         if(i == n)break;
         if(st.empty() || st.top().first != x){
            st.push({x, 1});
            i++;
         } else {
            st.top().second++;
            i++;
         }
      }
      while(!st.empty()){
         pair <char, int> temp = st.top();
         while(temp.second--) ans += temp.first;
         st.pop();
      }
      reverse(ans.begin(), ans.end());
      return ans;
   }
};
main(){
   Solution ob;
   cout <<(ob.removeDuplicates("deeedbbcccbdaa", 3));
}

입력

"deeedbbcccbdaa"
3

출력

aa