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

C++의 두 문자열에 대한 최소 ASCII 삭제 합계


w1과 w2라는 두 단어가 있다고 가정하면 w1과 w2를 동일하게 만들기 위해 삭제된 문자의 가장 낮은 ASCII 합계를 찾아야 합니다. 끈. 따라서 입력이 "sea" 및 "eat"와 같은 경우 출력은 231이 됩니다. w1에서 ''를 삭제해야 하므로 w2에서 "ea"가 되고 "eat"에서 "t"가 삭제됩니다. 그런 다음 그들은 동일합니다. "eat"에서 't'를 삭제하면 합계에 116이 추가되고 결국 두 문자열은 동일하며 115 + 116 =231이 이를 달성할 수 있는 최소 합계입니다.

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

  • n :=s1의 크기, m :=s2의 크기
  • 문자열 s1 및 s2 앞에 공백 하나를 추가한 다음 그에 따라 s1 및 s2를 업데이트합니다.
  • (n + 1) x (m + 1) 크기의 테이블 하나 만들기
  • i :=1 ~ m
    • dp[0, i] :=dp[0, i - 1] + s2[i]
  • i:=1 ~ n
    • dp[i, 0] :=dp[i – 1, 0] + s1[i]
  • 1~n
      범위의 i에 대해
    • 1 ~ m
        범위의 j에 대해
      • s1[i] =s2[j]
          인 경우
        • dp[i, j] :=dp[i – 1, j – 1]
      • else dp[i, j] =dp[i – 1, j] + 1 및 dp[i, j - 1] + 1의 최소값
  • dp[n, m]을 반환

예시(C++)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int minimumDeleteSum(string s1, string s2) {
      int n = s1.size();
      int m = s2.size();
      s1 = " " + s1;
      s2 = " " + s2;
      vector < vector <int> > dp(n + 1, vector <int>(m + 1));
      for(int i = 1; i <= m; i++){
         dp[0][i] = dp[0][i - 1] + s2[i];
      }
      for(int i = 1; i <= n; i++){
         dp[i][0] = dp[i - 1][0] + s1[i];
      }
      for(int i = 1; i <= n; i++){
         for(int j = 1; j <= m; j++){
            if(s1[i] == s2[j]){
               dp[i][j] = dp[i - 1][j - 1];
            }
            else{
               dp[i][j] = min(dp[i - 1][j] + s1[i], dp[i][j - 1] + s2[j]);
            }
         }
      }
      return dp[n][m];
   }
};
main(){
   Solution ob;
   cout << (ob.minimumDeleteSum("sea", "eat"));
}

입력

"sea"
"eat"

출력

231