#P2187. 第2题-字符串
-
1000ms
Tried: 83
Accepted: 33
Difficulty: 4
所属公司 :
百度
时间 :2024年10月15日-算法
-
算法标签>模拟
第2题-字符串
解题思路
本题的关键在于如何有效地模拟每一次的字符移动。本质是每次都要往后移动两次,每一次操作都要将当前下标的字符移动到字符串末尾并标记已用,重复这个过程直到完成 ( n ) 次操作。考虑到字符串的长度可能达到 ( 10^6 ),我们需要采用高效的方法以避免超时。
c++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
string s;
cin>>s;
int n=s.size();
int pos=0;
for(int i=0;i<n;i++)
{
s+=s[pos];
s[pos]='?';//标记已经用过的
int c=0;
if(i==n-1)break;
while(c<2)//找下一个要移动到末尾的
{
c+=s[pos]!='?';
pos++;
if(c==2)
{
pos--;
break;
}
}
}
for(int i=0;i<s.size();i++)
{
if(s[i]!='?')cout<<s[i];
}
}
python
def main():
s = input().strip()
n = len(s)
pos = 0
# 转换字符串
for i in range(n):
s += s[pos] # 追加 pos 位置的字符
s = s[:pos] + '?' + s[pos + 1:] # 标记该字符为已用
c = 0
if i == n - 1:
break
# 找下一个要移动到末尾的字符
while c < 2:
if s[pos] != '?':
c += 1
pos += 1
if c == 2:
pos -= 1 # 移回到上一个有效位置
break
# 打印转换后的字符串
result = ''.join([char for char in s if char != '?'])
print(result)
if __name__ == "__main__":
main()
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
int n = s.length();
int pos = 0;
// 转换字符串
for (int i = 0; i < n; i++) {
s += s.charAt(pos); // 追加 pos 位置的字符
s = s.substring(0, pos) + '?' + s.substring(pos + 1); // 标记该字符为已用
int c = 0;
if (i == n - 1) {
break;
}
// 找下一个要移动到末尾的字符
while (c < 2) {
if (s.charAt(pos) != '?') {
c++;
}
pos++;
if (c == 2) {
pos--; // 移回到上一个有效位置
break;
}
}
}
// 打印转换后的字符串
StringBuilder result = new StringBuilder();
for (char ch : s.toCharArray()) {
if (ch != '?') {
result.append(ch);
}
}
System.out.println(result.toString());
}
}
题目内容
长度为 n 只包含小写字母的字符串 S ,下标 1 开始。
进行 n 次操作第 i 次操作将 Si 移动到字符串末尾。输出 n 次操作后的字符串。
例如字符串"abqde",第一步"bqdea",第二步"bdeaq",第三步"bdaqe",第四步"bdaeq",第五步"bdaeq"。
输入描述
在一行上输入一个由小写字母构成的字符串,长度记为 n(1≤n≤106)。
输出描述
在一行上输出一个字符串,表示操作后的字符串。
样例1
输入
paectc
输出
accept
说明
第一步 aectcp,第二步 actcpe,第三步 accpet,第四步 accetp,第五步 accept,第六步 accept。
样例2
输入
abqde
输出
bdaeq