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

C++의 최소 문자열

<시간/>

길이가 같은 두 개의 문자열 s와 t가 있고 둘 다 소문자라고 가정합니다. 처음에 s를 임의의 순서로 재배열한 다음 s를 t로 바꾸는 데 필요한 최소 변경 수를 세는 것을 고려하십시오.

따라서 입력이 s ="eccynue", t ="science"와 같으면 출력은 "eccynue"를 "yccence"로 재배열한 다음 y를 s로 바꾸고 i와 함께 두 번째 c는 "과학"이 됩니다.

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

  • ret :=0

  • s의 주파수를 유지하기 위해 두 개의 배열 cnt1을 정의하고 t의 주파수를 유지하기 위해 cnt2를 정의합니다.

  • initialize i :=0의 경우 i <26일 때 업데이트(i 1만큼 증가), -

    • 렛 :=렛 + 최대(cnt1[i] - cnt2[i], 0)

  • 리턴 렛

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

예시

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(string s, string t) {
      int ret = 0;
      vector <int> cnt1(26);
      vector <int> cnt2(26);
      for(int i = 0; i < s.size(); i++){
         cnt1[s[i] - 'a']++;
      }
      for(int i = 0; i < t.size(); i++){
         cnt2[t[i] - 'a']++;
      }
      for(int i = 0; i < 26; i++){
         ret += max(cnt1[i] - cnt2[i], 0);
      }
      return ret;
   }
};
int main(){
   Solution ob;
   cout << (ob.solve("eccynue", "science"));
}

입력

"eccynue", "science"

출력

2