718. 최장 중복 서브그룹

1832 단어 문자열DP

718. 최장 중복 서브그룹


두 개의 정수수조AB를 주고 두 개의 수조에서 공용되고 길이가 가장 긴 자수조의 길이를 되돌려줍니다.
예1:
  :
A: [1,2,3,2,1]
B: [3,2,1,4,7]
  : 3
  : 
            [3, 2, 1]。

설명:
  • 1 <= len(A), len(B) <= 1000
  • 0 <= A[i], B[i] < 100

  • 최장 연속 문자열, 최장 서브 시퀀스 (반드시 연속하지는 않음)


    최장 연속 문자열은 이 문자열이 연속적이어야 한다. 그러면 동적 기획의 사상에서 d[i][j]를 A에서 i자리로 끝내고 B에서 j로 끝내는 위치의 문자열의 최장 연속 문자열 길이로 설정한다.
    그러면 상태 전환 방정식은 다음과 같습니다.
    D[i][j]=a[i]==b[i]?d[i-1][j-1]+1:0
    설명: i에서 시작하여 B를 처음부터 반복한다. 현재 j위치 문자가 i와 같다는 것을 발견하면 한 칸 +1을 함께 한다. 그렇지 않으면 처음부터 지금까지 연속적인 공통 서브열이 없다는 것을 의미한다.이 해석은 i=1에서 볼 때 i가 1과 같을 때 같은 문자를 만나 다음 매칭 문자열로 들어간다. 지금 두 번째를 고려하면 두 번째도 상응하는 위치에 매칭되면 똑같이 1을 더한다. 공교롭게도 이 두 번째 문자가 i=1이라는 문자 뒤에 있으면 다음 문자로 늘어난다.
    전체 이 과정은 마치 모든 자열이 스스로 성장하는 것처럼 보인다.연속 문자열을 만나면 점차 밀어낸다.
     
    Code:
    class Solution {
    public:
        int findLength(vector& A, vector& B) {
            int m=A.size();
            int n=B.size();
        //     vector > dp(A.size() + 1, vector(B.size() + 1, 0));
    int dp[m+1][n+1]={};
            cout<
            int max=0;
            for(int i=1;i<=m;i++)
              {  for(int j=1;j<=n;j++)
                {
                    if(A[i-1]==B[j-1])dp[i][j]=1+dp[i-1][j-1];
                    else dp[i][j]=0;
                    if(dp[i][j]>max)max=dp[i][j];
                    //cout<
                }
              //cout<
              }
            return max;
        }
    };

    좋은 웹페이지 즐겨찾기