题目背景
小果有一个只有两个键的键盘。
题目描述
一天,她打出了一个只有这两个字符的字符串。当这个字符串里含有 VK
这个字符串的时候,小果就特别喜欢这个字符串。所以,她想改变至多一个字符(或者不做任何改变)来最大化这个字符串内 VK
出现的次数。给出原来的字符串,请计算她最多能使这个字符串内出现多少次 VK
(只有当 V
和 K
正好相邻时,我们认为出现了 VK
。)
输入格式
第一行给出一个数字 nn,代表字符串的长度。
第二行给出一个字符串 ss。
输出格式
第一行输出一个整数代表所求答案。
输入输出样例
输入 #1
2 VK
输出 #1
1
输入 #2
2 VV
输出 #2
1
输入 #3
1 V
输出 #3
0
输入 #4
20 VKKKKKKKKKVVVVVVVVVK
输出 #4
3
输入 #5
4 KVKV
输出 #5
1
说明/提示
对于 100%的数据,1≤n≤100
答案及解析
看完输入格式直接就可以敲代码了,先把输入部分拿下
int n;
string s;
scanf("%d",&n);
cin>>s;
因为1<=n<=100,所以用int可以直接解决,不用long long int。
再次读题,题目要求是请计算她最多能使这个字符串内出现多少次 VK
,且输入的字符串只存在V或K
,所以我们可以把这道题的思路分为两部分
一,计算字符串中子串VK的数量
二,改变后VK的数量
首先完成第一步:(解析看注释)
for(int i=0;i<n-1;i++){//s字符串的范围是s[0]~s[n-1],由于代码中需要判断该字符的下一位是否为‘K',所以i只运行到n-2
if(s[i]=='V'&&s[i+1]=='K'){//查找VK
sum++;//找到VK,sum加1
s[i]='X',s[i+1]='X';//将找到的数推翻,保证不会重复计算
i++;//s[i+1]已被推翻,从s[i+2]继续遍历,可以节省时间
}
}
接着再做第二步:
写代码前,我们先要分析改变的规则
因为需要将原子串改变为’VK',所以一次改变至少需要两个字符
这两个字符有3种排列可能,即 VV , KK , KV (注:VK已经被推翻了)
当子串为KV时,ta不可能在只修改一次的情况下变为KV,所以不对ta进行判断和操作
所以判断子串为 VV , KK 的判断条件为
s[i]!='X'&&s[i]==s[i+1]
如果条件成立,便可以输出sum+1的值
如果无成立条件,最后输出sum
ok啊,好吧,直接上xdm最喜欢的代码(解析都在上面,这次我就不写注释了。。。绝对不是懒,嘿嘿 >_<)
#include <bits/stdc++.h>
using namespace std;
int n,sum;
int main(){
string s;
scanf("%d",&n);
cin>>s;
for(int i=0;i<n-1;i++){
if(s[i]=='V'&&s[i+1]=='K'){
sum++;
s[i]='X',s[i+1]='X';
i++;
}
}
for(int i=0;i<n-1;i++){
if(s[i]!='X'&&s[i]==s[i+1]){
sum++;
cout<<sum;
return 0;
}
}
cout<<sum;
return 0;
}
最后再加亿点细节,给代码简化一下
(备注一下:++放前面是先将变量加1,再运行代码,放后面则相反)
#include <bits/stdc++.h>
using namespace std;
int n,sum;
int main(){
string s;
scanf("%d",&n);
cin>>s;
for(int i=0;i<n-1;i++)
if(s[i]=='V'&&s[i+1]=='K')
sum++,s[i]='X',s[++i]='X';
for(int i=0;i<n-1;i++){
if(s[i]!='X'&&s[i]==s[i+1]){
cout<<++sum;
return 0;
}
}
cout<<sum;
return 0;
}
啊啊啊啊啊啊,看在作者打这么多字的份上,留下点赞加关注吧,求求了~~