AtCoder ABC 049 C - 白日梦 (DP写法)
题目传送门:Here
Description
提供由小写字符构成的长度N的字符串S。
请将S分割成几个连续的字符串,并判断这些字符串是否能够全部变成“dream”、“dreamer”、“erase”、“eraser”。
$1\le N \le 10^5$
在这里试试DP。
DP[i]
\(\leftarrow\) 对于字符串S的第一个 \(i\) 个字符,是否可以按满足条件进行区间分割
然后转变可以如下。
dp[i - 5]
If = True andS[i-5:i]
= "dream",dp[i]
= Truedp[i-7]
If = True andS[i-7:i]
= "dreamer",dp[i]
= Truedp[i-5]
If = True andS[i-5:i]
= "erase",dp[i]
= Truedp[i-6]
If = True andS[i-6:i]
= "eraser",dp[i]
= True
时间复杂度:\(\mathcal{O}(N)\)
vector<string> strs = {"dream", "dreamer", "erase", "eraser"};
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
string s; cin >> s;
vector<bool>dp(s.size() + 1, false);
dp[0] = true;
for (int i = 1; i <= s.size(); ++i) {
for (auto str : strs) {
if (i >= str.size() &&
dp[i - str.size()] &&
s.substr(i - str.size(), str.size()) == str)
dp[i] = true;
}
}
if (dp[s.size()]) cout << "YES\n";
else cout << "NO\n";
}