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 and S[i-5:i]= "dream", dp[i]= True
  • dp[i-7]If = True and S[i-7:i]= "dreamer", dp[i]= True
  • dp[i-5]If = True and S[i-5:i]= "erase", dp[i]= True
  • dp[i-6]If = True and S[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";
}
posted @ 2021-08-08 15:37  RioTian  阅读(87)  评论(0编辑  收藏  举报