题意:
^_^和^^是想要的,题目让我们把输入的字符串,向里面添加 ^ 或者 _ 使得整个字符串都是这两部分组成的,问最少添加多少个字符。
解:这道题我调试了挺多次,基本逻辑就是,遍历到一个字符时,判断它前面是_吗,根据这个和当前字符是什么来确定是否需要添加。
因为如果是_的话,它的左右两边必须是^^它才能合理存在,其中我们还要对结尾进行特判,因为我们无法遍历到最后位置的后一个位置,所以如果结尾是个_,那它后面必须加一个^;
其他的,如果输入字符串就是一个单独的^,只需要添加一个^构成^^即可。
#include<bits/stdc++.h>
using namespace std;
int t,ans,flag;
string s;
int main()
{
cin>>t;
while(t--)
{
cin>>s;
ans=0,flag=0;
if(s=="^")//特判
{
cout<<"1"<<endl;
continue;
}
if(s[s.size()-1]=='_')//结尾
ans=1;
for(int i=0; i<s.size(); i++)
{
if(flag==0 && s[i]=='_')
{
ans++;
flag=0;
}
else if(flag==0 && s[i]=='^')
flag=1;
else if(flag==1 && s[i]=='_')
flag=0;
}
cout<<ans<<endl;
}
return 0;
}
做出来之后,还看了看其他人的写法,发现有个嘎嘎简单的写法,比我少了很多行代码:
#include<bits/stdc++.h>
using namespace std;
int t;
string s;
int main()
{
cin>>t;
while(t--)
{
cin>>s;
s ='_'+s+'_';
if(s.size()==3&&s[1]=='^')
{
cout<<"1"<<endl;;
continue;
}
int ans=0;
for(int i=1;i<s.size();i++)
if(s[i]=='_'&&s[i - 1]=='_') ans++;//两_之间加^
cout <<ans<<endl;
}
return 0;
}
在两端加上一个_,然后只需要在_和_之间加一个^即可,你别说,你还真别说,真妙啊。