文章目录
题面翻译
定义对称如下:
- 空串
- 一个字母’i’
- 一个字母’w’
- 在两个字母(‘i’或’w’)中包含一个对称的字符串,如"iwi",“wiw”,“ii”,“www”
- 在括号中包含一个对称的字符串,注意括号有两种形式,1、“()” 2、“)(”,即"(i)“和”)i("均为合法对称字符串
求最少进行几次更改操作,使一个字符串变为对称
输入
一个由’i’,‘w’,'(‘和’)'组成的字符串
输出
一个正整数,即最少更改次数
样例
输入1:
(iwi)
输出1:
0
说明1:
改串已为对称,不许更改
输入2:
ii(((((ww
输出2:
5
说明2:
可以更改成ww((i))ww,当然也有其他做法
数据范围
输入字符串的长度len<=10
原题/洛谷原题
解题
题目并不难,但容易错
错误代码1
#include<bits/stdc++.h>
using namespace std;
string n;
int l,s,k;
bool hui(char a,char b){
if(a==b || a=='(' && b==')' || a==')' && b=='(') return 1;
return 0;
}
int main(){
cin>>n;
l=n.size();
s=(l+1)/2;
k=s;
for(int i=0;i<k;i++){
if(hui(n[i],n[l-i-1]))
s--;
}
cout<<s;
return 0;
}
这个代码做错后,我去题解康了康,原来是
a
=
=
b
a==b
a==b那错了
给你们看一个hack样例
输入: ( ( ( ( ( ( (((((( ((((((
正确输出: 3 3 3
这个输出: 0 0 0
你们可以试试…
错误代码2
#include<bits/stdc++.h>
using namespace std;
string n;
int l,s,k;
bool hui(char a,char b){
if(a=='i' && b=='i' || a=='w' && b=='w' || a=='(' && b==')' || a==')' && b=='(') return 1;
return 0;
}
int main(){
cin>>n;
l=n.size();
s=(l+1)/2;
k=s;
for(int i=0;i<k;i++){
if(hui(n[i],n[l-i-1]))
s--;
}
cout<<s;
return 0;
}
这个代码我找了2分钟才找到错误,大家可以找找看…
————————————————————————————分界线
忘了这个代码是歪国题,最后没输出换行 ’~’
然后改好后就AC啦!
AC代码1
#include<bits/stdc++.h>
using namespace std;
string n;
int l,s,k;
bool hui(char a,char b){
if(a=='i' && b=='i' || a=='w' && b=='w' || a=='(' && b==')' || a==')' && b=='(') return 1;
//上面代码为核心,判断是否对称
return 0;
}
int main(){
cin>>n;
l=n.size();
s=(l+1)/2;//最多改一边的字符,所以折半
k=s;
for(int i=0;i<k;i++){
if(hui(n[i],n[l-i-1]))//这里对n字符串进行对称比较
s--;//有对称就少一个修改
}
cout<<s<<"\n";
return 0;
}
AC代码2
#include<bits/stdc++.h>
using namespace std;
string n;
int l,s,k;
bool hui(char a,char b){
if(a=='i' && b=='i' || a=='w' && b=='w' || a=='(' && b==')' || a==')' && b=='(') return 1;
//上面代码为核心,判断是否对称
return 0;
}
int main(){
cin>>n;
l=n.size();
s=0;//最少改0个,所以从0
k=(l+1)/2;
for(int i=0;i<k;i++){
if(hui(n[i],n[l-i-1])==0)//这里对n字符串进行对称比较,也可以写为~!hui(n[i],n[l-i-1])~
s++;//无对称就多一个修改
}
cout<<s<<"\n";
return 0;
}