UVA 11988 Broken Keyboard
题目大意
给定一个字符串,字符串中可能含有
被
解题思路
解法1
用一个类似循环链表的东西存储这个字符串,
遇到
当前光标位于
如果
每次插入完一个数不要忘记
代码
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
char s[N];
int cur, ne[N], last;
int main()
{
while (cin >> s + 1)
{
int len = strlen(s + 1);
last = cur = ne[0] = 0;
for (int i = 1; i <= len; i ++ )
{
char ch = s[i];
if (ch == '[') cur = 0; //Home
else if (ch == ']') cur = last; //End
else {
ne[i] = ne[cur], ne[cur] = i, cur = i; //插入一个字符
if (ne[i] == 0) last = i; //屏幕边缘向右扩展
}
}
for (int i = ne[0]; i; i = ne[i]) putchar(s[i]);
puts("");
}
return 0;
}
解法2
用一个双端队列保存这个屏幕,遇到[键就设置flag = true,遇到]键设置flag = false;
对于一个字符,当flag = true , 插入到前面,否则插入到后面
这样对吗?
错的!!!!!!!!!!!!!
被[]框起来的字符串将会被移到最开头
所以这题我们只要遇到[就开始统计,将被[]框起来的字符串移到deque的队首,然后再把没被括号括中的字符串移到deque的队尾就好了
直接上代码
代码实现
#include <iostream>
#include <cstring>
#include <deque>
using namespace std;
int main()
{
string str;
while(cin >> str)
{
int len = str.size();
deque<string> q;
string S;
bool flag = true;
for(int i = 0; i < len; i ++ )
{
if (str[i] != '[' && str[i] != ']') S += str[i];
else {
flag ? q.push_back(S) : q.push_front(S);
flag = (str[i] == ']'), S = "";
}
}
flag ? q.push_back(S) : q.push_front(S);
for (auto str : q) cout << str;
cout << endl;
}
return 0;
}
时间
链表90ms,deque80ms
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)