白昼夢 / Daydream
做法
一个个判断过去,类似递归。
-
如果此时子串为 \(eraser\),计数器\(+5\),跳过这个子串。
-
如果此时子串为 \(erase\),计数器\(+4\),跳过。
-
如果此时子串为 \(dream\),计数器\(+4\),跳过。
-
如果此时子串为 \(dreamer\),注意\(er\)可能重复,要判断。
-
为 \(dreamer\) 时,计数器\(+6\),跳过。
-
否则是 \(dream...\) 或是 \(dream\),计数器\(+4\),跳过。
-
把条件筛选后就是正确的了。
代码
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
string s;
ll n; // 存长度
int main()
{
cin >> s;
n = s.size();
for (int i = 0; i < n; ++i)
{
if (s[i] == 'e')
{
// 此时有两个可能 eraser 和 erase
if (s[i + 1] == 'r' && s[i + 2] == 'a' && s[i + 3] == 's' && s[i + 4] == 'e')
{
if (s[i + 5] == 'r')
i += 5; // 下标不一样,懂吧。。
else
{
i += 4;
}
}
}
else if (s[i] == 'd')
{
// 此时的可能
if (s[i + 1] == 'r' && s[i + 2] == 'e' && s[i + 3] == 'a' && s[i + 4] == 'm')
{
// 此时有可能会与earse重复
if (s[i + 5] == 'e' && s[i + 6] == 'r' && s[i + 7] == 'a' && s[i + 8] == 's' && s[i + 9] == 'e')
i += 4;
else if (s[i + 5] == 'e' && s[i + 6] == 'r')
i += 6;
else
i += 4;
}
}
else
{
cout << "NO" << endl;
return 0;
}
}
cout << "YES" << endl;
return 0;
}
尾声
对于裁剪字符串,可以使用 \(substr()\) 取子串,具体自查。
同步发布于博客园,博客园已发布题解不同步于洛谷。