校验单词
输入:规则,AAA则忽略最后一个A输出AA,AABB输出AAB忽略最后一个B, AABBCC则输出AABCC从左到右连续两个。 2 helloo wooooooow
输出: hello woow
解析:有限状态机。因为下一个的状态需要上一个的状态决定,所以用此方法。
#include<iostream> #include<string> using namespace std; int main() { //自动机 int n; cin >> n; while (n--) { int state = 0;//初始化为状态0 char cur;//当前字符 string str;//目标字符串 cin >> str; char last = str[0];//初始化为第一个字符 string ans = ""; ans += str[0];//初始化 for (int i = 1; i < str.size(); ++i) {//开始 cur = str[i]; switch (state) { case 0: { if (cur == last)//如果是相等的,进入状态1,否则继续状态0; state = 1; //进入状态1:AA形式 else state = 0; //继续状态0:AB形式,即正常形式 break; } case 1: { if (cur == last) continue;//AAA,忽略即可,下面的所有代码都不会执行。直接新的for循环,所以这个字符就忽略掉了 else state = 2;//进入状态3:AAB形式 break; } case 2: { if (cur == last) continue;//AABB,忽略即可,下面的所有代码都不会执行。直接新的for循环,所以这个字符就忽略掉了 else state = 0;//AABC,就是状态0 break; } default: break; } ans = ans + cur; last = cur; } cout << ans << endl; } return 0; }