字符串_堆栈_备份数组_1915_D. Unnatural Language Processing

#include<bits/stdc++.h>

using namespace std;

const int N=2e5+10;

char backups[N];
char s[N];

void solve()
{
   
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>s[i];
	memcpy(backups,s,n);
	
	for(int i=0;i<n;i++)
		if(backups[i]=='a'||backups[i]=='e')
			backups[i]='V';
		else
			backups[i]='C';
	
	int case_tt=0;
	for(int i=0;i+3<n||i+2<n;)
	{
   
		if(i+2==n-1)
		{
   
			case_tt=1;
			break;
		}
		if(i+1==n-1)
		{
   
			case_tt=2;
			break;
		}
		
		if(backups[i]=='C'&&backups[i+1]=='V'&&backups[i+2]=='C'&&backups[i+3]=='C')
		{
   
			cout<<s[i]<<s[i+1]<<s[i+2]<<".";
			i+=3;
		}
		else 
		{
   
			cout<<s[i]<<s[i+1]<<".";
			i+=2;
		}
	}
	
	if(case_tt==1)
		cout<<s[n-3]<<s[n-2]<<s[n-1];
	else
		cout<<s[n-2]<<s[n-1];
	cout<<endl;
}

int main()
{
   
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin>>t;
	
	while(t--)
		solve();
	
	return 0;
}

非常激动啊

自己也是独立ac了该题,写算法基础提高进阶或者算法进阶指南基本都是看题解,非常具有挫败感,现在感觉非常有成就感

题解的方法明显正统很多,我的方法显得笨拙

另外case触发关键词了,所以直接报错,定义变量的时候需要注意不要和关键词有重叠

#include <bits/stdc++.h>

using namespace std;

const int MAX = 200'007;
const int MOD = 1'000'000'007;

void solve() {
   
	int n;
	cin >> n;
	string s;
	cin >> s;
	string res = "";
	while (!s.empty()) {
   
		int x;
		if (s.back() == 'a' || s.back() == 'e') {
   x = 2;}
		else {
   x = 3;}
		
		while (x--) {
   
			res += s.back();
			s.pop_back();
		}
		res += '.';
	}
	res.pop_back();
	reverse(res.begin(), res.end());
	cout << res << '\n';
}

int main() {
   
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int tt; cin >> tt; for (int i = 1; i <= tt; i++) {
   solve();}
	// solve();
}

我的做法

首先备份一下原来输入的字符串,(因为最近做了一些数组备份的题),然后把字母分类,把修改结果存到备份数组里面

遍历备份数组,如果发现是"CVCC"就说明前面的需要三个一起输出,实际上出现两个连在一起的C就行,出现两个连在一起的C就表示前面需要输出三个,但是我感觉回退的这种难以表示,所以就用了一个比较长的判断,每三个或者两个字母输出之后,输出一个点,然后判断一下是不是最后三个字母或者两个字母,如果是的话,就跳出循环,单独输出最后两三个字母,因为不需要加点了(可以学着答案,用一个字符串保存答案,然后最叼最后一个点,感觉也可行)

注意判断是不是最后两三个字母需要在循环开始时就进行判断,主要因为字符串的长度可能不够

循环变量的更新方式是根据条件判断进行更新的,输出的时候输出的是原数组,条件判断使用的是备份数组

尝试修改了一下自己的代码,想要改的简洁一些,发现需要考虑的情况太多了,要考虑字符串的长度,各种边界情况

#include<bits/stdc++.h>

using namespace std;

void solve()
{
   
	int n;
	cin>>n;
	string s;
	cin>>s;
	string res="";
	
	while(!s.empty())
	{
   
		int x=0;
		if(s.back()=='a'||s.back()=='e')
			x=2;
		else
			x=3;
		
		while(x--)
		{
   
			res+=s.back();
			s.pop_back();
		}
		res+='.';
	}
	res.pop_back();
	reverse(res.begin(),res.end());
	
	cout<<res<<endl;
}

int main()
{
   
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin>>t;
	
	while(t--)
		solve();
	
	return 0;
}

堆栈,字符串

正解确实优雅,首先读入字符串,定义一个空的答案字符串,从最后一个字符开始遍历,如果最后一个字母是'V'表示回退两格,另一种情况是回退三格,从后往前考虑确实简单一些,因为两种情况的区别就是最后一个字母,然后把字符加到答案字符串,加完之后加一个点,从后往前操作字符串其实类似于操作栈顶元素,每一次使用栈顶元素然后让栈顶元素出栈,最后多加了一个点,去掉那个点,把答案字符串翻转,就是最后的答案

相关推荐

  1. 字符串

    2024-02-07 09:06:03       45 阅读
  2. 字符串的反转

    2024-02-07 09:06:03       28 阅读
  3. (第四章)管理字符串

    2024-02-07 09:06:03       39 阅读
  4. 学习前端第二十七天(字符串

    2024-02-07 09:06:03       30 阅读
  5. 数据结构及算法——字符串一些记录

    2024-02-07 09:06:03       35 阅读
  6. C语言如何进⾏字符的连接?

    2024-02-07 09:06:03       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-07 09:06:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-07 09:06:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-07 09:06:03       87 阅读
  4. Python语言-面向对象

    2024-02-07 09:06:03       96 阅读

热门阅读

  1. mysql问题

    2024-02-07 09:06:03       44 阅读
  2. QT QCombox 样式表 比起作用

    2024-02-07 09:06:03       44 阅读
  3. Spring和Spring Boot的区别

    2024-02-07 09:06:03       51 阅读
  4. YY调音台:音频后期处理

    2024-02-07 09:06:03       53 阅读
  5. Linux常用命令

    2024-02-07 09:06:03       46 阅读
  6. Spring Boot使用easy poi

    2024-02-07 09:06:03       56 阅读
  7. Python requests库请求封装

    2024-02-07 09:06:03       56 阅读
  8. 力扣283.移动零

    2024-02-07 09:06:03       55 阅读
  9. css基础

    css基础

    2024-02-07 09:06:03      53 阅读