C. Perfect Keyboard
题目大意:
Polycarp希望组装自己的键盘。多行的布局对他来说太复杂了-他的键盘只有一行,而所有26小写拉丁字母将按一定顺序排列。
他的密码s,它们应该在键盘上相邻。例如,如果密码是abacaba,则布局cabdefghi …是完美的,因为键盘上的字符a和c相邻,而键盘上的a和b则相邻。确保在其中没有两个相邻的相等字符s,例如,密码不能是password(两个字符s相邻)。
如果可以的话,您可以帮助Polycarp选择键盘的完美布局吗?
输入输出看网站
思路: 双指针进行模拟密码的左右端点**(lift,right),另一个指针指向当前密码移动的位置(now)**,并设立判重数组。
1.如果当前 now > lift 并且当前的 now指针的左端等于当前正在扫描的字符,now就要向左移动;
2.同理,右端也是如此。
3.如果当前的 now指针==lift,即在端点,并且当前扫描的字符没有被标记,则向左开辟密码串,并左移动lift 和 now ,并标记字符。
4.同理右端也是如此。
5.如过上述的情况全部符合,密码就是错误。
ac代码
#include <bits/stdc++.h>
char str[205], ans[105];
bool vis[105];
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
scanf("%s", str + 1);
int n = strlen(str + 1), l = 27, r = 27, now = 27, flag = 0;
ans[l] = str[1];
memset(vis, 0, sizeof(vis));
vis[str[1] - 'a'] = 1; //字符处理成数字
for (int i = 2; i <= n; i++)
{
if (now > l && ans[now - 1] == str[i])
now--;
else if (now < r && ans[now + 1] == str[i])
now++;
else if (now == l && !vis[str[i] - 'a'])
{
ans[--l] = str[i];
now--;
vis[str[i] - 'a'] = 1;
}
else if (now == r && !vis[str[i] - 'a'])
{
ans[++r] = str[i];
now++;
vis[str[i] - 'a'] = 1;
}
else
{
flag = 1;
break;
}
}
if (flag)
puts("NO");
else
{
puts("YES");
for (int i = l; i <= r; i++)
putchar(ans[i]);
for (int i = 0; i < 26; i++)
if (!vis[i])
putchar(i + 'a');
puts("");
}
}
return 0;
}