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

C++에서 가장 긴 공통 부분 시퀀스의 길이를 찾는 프로그램

<시간/>

두 개의 문자열 text1과 text2가 있다고 가정하고 가장 긴 공통 부분 시퀀스의 길이를 찾아야 합니다. 우리가 알고 있듯이 문자열의 하위 시퀀스는 나머지 문자의 상대적 순서를 변경하지 않고 일부 문자가 삭제된 원래 문자열에서 생성된 새 문자열입니다. (예를 들어 "abe"는 "abcde"의 하위 시퀀스이지만 "adc"는 그렇지 않습니다). 두 문자열의 공통 부분 수열은 두 문자열에 공통적인 부분 수열입니다. 따라서 공통 부분 수열이 없으면 0을 반환합니다. 입력이 "abcde" 및 "ace"와 같으면 결과는 3이 됩니다.

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

  • n :=s의 크기, m :=x의 크기

  • n이 0이거나 m이 0이면 0을 반환합니다.

  • s :=s로 연결된 빈 문자열

  • x :=x로 연결된 빈 문자열

  • ret :=0

  • 차수의 행렬 dp 정의 (n + 1) x (m + 1)

  • 범위 1에서 n까지의 i에 대해

    • 범위 1에서 m까지의 j에 대해

      • dp[i, j] :=dp[i, j - 1] 및 dp[i – 1, j]

        의 최대값
      • s[i] =x[j]이면

        • dp[i, j] :=dp[i, j]의 최대값, 1 + dp[i – 1, j – 1]

  • 반환 dp[n, m]

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

예시

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int longestCommonSubsequence(string s, string x) {
      int n = s.size();
      int m = x.size();
      if(!n || !m) return 0;
      s = " " + s;
      x = " " + x;
      int ret = 0;
      vector < vector <int> > dp(n + 1, vector <int>(m + 1));
      for(int i = 1; i <= n; i++){
         for(int j = 1; j <= m ; j++){
            dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
            if(s[i] == x[j]) {
               dp[i][j] = max(dp[i][j], 1 + dp[i - 1][j - 1]);
            }
         }
      }
      return dp[n][m];
   }
};
main(){
   Solution ob;
   cout << (ob.longestCommonSubsequence("abcde", "ace"));
}

입력

"abcde"
"ace"

출력

3