专栏文章
题解:B3958 [GESP202403 四级] 相似字符串
B3958题解参与者 50已保存评论 55
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 55 条
- 当前快照
- 1 份
- 快照标识符
- @mm7t6mma
- 此快照首次捕获于
- 2026/03/01 21:51 上周
- 此快照最后确认于
- 2026/03/01 21:52 上周
个人觉得此题还行,我不会告诉你我提交了三次。
思路
把删除字符和增加字符两种操作合并成一种,本人没有做任何字符串操作。我分成了以下三种情况:
1.两个字符串长度相等,改变字符串方式只有改变字符串中的字符一种方式,所以只需在两个字符串中寻找不相同字符个数,如果不相同字符数小于等于 ,就可以,否则不行。
2.两个字符串长度相差等于 ,先将长度长度字符串放在第一个,方便操作。只需在两个字符串中遍历,整个标记,在第一个不相同的字符改标记,标记代表第二个字符串中已经有插入过数,以后坐标都改成 。当标记为 时,在后面还能找到不同的字符,也是没救的。
3.两个字符串长度相差大于 ,这是没救的。
1.两个字符串长度相等,改变字符串方式只有改变字符串中的字符一种方式,所以只需在两个字符串中寻找不相同字符个数,如果不相同字符数小于等于 ,就可以,否则不行。
2.两个字符串长度相差等于 ,先将长度长度字符串放在第一个,方便操作。只需在两个字符串中遍历,整个标记,在第一个不相同的字符改标记,标记代表第二个字符串中已经有插入过数,以后坐标都改成 。当标记为 时,在后面还能找到不同的字符,也是没救的。
3.两个字符串长度相差大于 ,这是没救的。
AC code:
CPP#include <bits/stdc++.h>//万能头
using namespace std;
int main(){
int n;cin>>n;//输入
while(n--){
string a,b;cin>>a>>b;//输入
if(a.size()<b.size()) swap(a,b);//统一字符串 a 最长,方便操作
if(a.size()-b.size()>1){//如果长度相差大于 1,无论怎么做都无法一样
cout<<"not similar"<<endl;
continue;
}
if(a.size()-b.size()==1){//如果相差 1 就统一让字符串 b 增加一个字母
int ans=0,f=0;//ans 代表 b[i] 当前是否有和 a[i] 不相等
for(int i = 0;i<b.size();i++){
if(a[i+ans]!=b[i])ans=1;//如果不相等 ans 就为 1
if(ans&&a[i+ans]!=b[i]){//如果 ans 已经为 1 了还不相等就没救了
cout<<"not similar"<<endl;
f=1;
break;//要退循环,不然你会看见好多个 not similar
}
}
if(f==0) cout<<"similar"<<endl;
}
if(a.size()==b.size()){//如果长度相等,直接判断 a 和 b 有多少个不相等
int sum=0;
for(int i = 0;i<a.size();i++){
if(a[i]!=b[i]) sum++;//统计有多少个不相等
}
if(sum<=1) cout<<"similar"<<endl;//不相等数量小于等于 1 是就可以
else cout<<"not similar"<<endl;
}
}
return 0;//完结撒花
}
相关推荐
评论
共 55 条评论,欢迎与作者交流。
正在加载评论...