diff --git a/C++/valid-permutations-for-di-sequence.cpp b/C++/valid-permutations-for-di-sequence.cpp new file mode 100644 index 000000000..d9c5cff9b --- /dev/null +++ b/C++/valid-permutations-for-di-sequence.cpp @@ -0,0 +1,24 @@ +// Time: O(n^2) +// Space: O(n) + +class Solution { +public: + int numPermsDISequence(string S) { + const int M = 1e9 + 7; + vector> dp(2, vector(S.length() + 1, 1)); + for (int i = 0; i < S.length(); ++i) { + if (S[i] == 'I') { + dp[(i + 1) % 2][0] = dp[i % 2][0]; + for (int j = 1; j < S.length() - i; ++j) { + dp[(i + 1) % 2][j] = (dp[(i + 1) % 2][j - 1] + dp[i % 2][j]) % M; + } + } else { + dp[(i + 1) % 2][S.length() - i - 1] = dp[i % 2][S.length() - i]; + for (int j = S.length() - i - 2; j >= 0; --j) { + dp[(i + 1) % 2][j] = (dp[(i + 1) % 2][j + 1] + dp[i % 2][j + 1]) % M; + } + } + } + return dp[S.length() % 2][0]; + } +};