Leetcode dp Distinct Subsequences

1935 단어

Distinct Subsequences

 
Total Accepted: 15484 
Total Submissions: 62324 My Submissions
Given a string S and a string T, count the number of distinct subsequences of T in S.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie,  "ACE"  is a subsequence of  "ABCDE"  while  "AEC"  is not).
Here is an example: S =  "rabbbit" , T =  "rabbit"
Return  3 .
제목: 만약 어떤 문자열str1이 다른 문자열str2에서 일부 문자를 삭제하고 다른 문자가str2에서 순서를 유지한다면
그러면str1은str2의 자열이라고 합니다.
아이디어:
Edit Distance 문제랑 비슷해요.
dp[i][j]를 설정하면str1[0...j]이str2[0...i]에 나타난 횟수를 나타낸다.
dp[i][j] = dp[i - 1][j] , if str1[j] != str2[i]
왜냐하면str1[j]!=str2[i]이므로 str2[i]만 삭제할 수 있습니다
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j], if str1[j] == str2[i]
str1[j]==str2[i]이기 때문에str2[i]를 보류하거나 삭제할 수 있습니다
실현할 때 1차원 스크롤 수 있는 그룹 dp[j]-->어느 한 차원이 i상태를 계산할 때 i-1상태만 사용하면 스크롤 수 있는 그룹
-->여기가 틀린 것 같은데, 여기서 초기화할 때 각각 dp[i][0]를 1로 설정해야 하는데, 1차원 수조만 사용하면 dp[0][0]만 1로 설정할 수 있어요.
-->그래서 2차원 그룹을 사용합니다
-->인터넷에서 누군가가 1차원 그룹을 사용해도 되는데 j가 순환할 때 뒤에서 앞으로 교체된다.
복잡도: 시간 O (n^2), 공간 O (n^2)
int numDistinct(string S, string T) {
	vector<vector<int> > dp(S.size() + 1, vector<int>(T.size() + 1, 0));
	for(int i = 0; i <= S.size(); ++i) dp[i][0] = 1;
	for(int i = 1; i <= S.size(); ++i){
		for(int j = 1; j <= T.size(); ++j){
			if(S[i - 1] == T[j - 1]) dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
			else dp[i][j] = dp[i - 1][j];
		}
	}
	return dp[S.size()][T.size()];
}

좋은 웹페이지 즐겨찾기