第一题:共同之处
Description
这个题目很简单,请你给出所有输入字符串的共同的前缀中最长的那个,如果没有,就输出 “-1”。
Format
Input
一行,若干个用空格隔开的长度小于 500 的字符串,仅包含小写字母,字符串个数不超过 200。
Output
输出题目要求的结果。
Samples
输入数据 1
ab abc abcd
输出数据 1
ab
输入数据 2
ab cd ef
输出数据 2
-1
Limitation
1s, 1024KiB for each test case.
思路:
这道题数据量不大,允许我们直接套两层循环来遍历,所以可以用一个比较笨的方法。可以每次比较两个字符串,看他们最长公共前缀有多长,然后每次都取最短的那个公共前缀就行了。
为什么这样可以呢?是因为假如说你比较了第一个字符串和第二个字符串,发现他们的公共前缀是s,然后再去找第二个字符串和第三个字符串的最长公共前缀是s1。然后你比较s和s1,如果s和s1均不为空的话,那么s和s1一定有前三个字符串的最长公共前缀,这个最长公共前缀就是s和s1里长度更短的那个。想到这里就可以开始写了。
代码(含注释):
#include<bits/stdc++.h>
using namespace std;
string s[207],str;
string sum,ans="";
int main(){
int n=0;
while(cin>>s[n]){ //读入
n++; //记录一共输入了多少个字符串
}
ans=s[0]; //这里ans=s[0]是因为一开始也需要一个字符串来比较长度,而毕竟是最长公共前缀,所以不可能超过任何一个字符串的长度,所以这个长度是可以比较的
for(int i=1;i<n;i++){ //从第二个字符串开始比较(比较第i个字符串和第i-1个字符串)
str=s[i-1]; //取第i-1个字符串来比较
sum=""; //sum用来存最长公共前缀
for(int j=0;j<s[i].length();j++){ //比较每一个字符
if(s[i][j] != str[j]){ //如果找到了不一样的字符 直接退出
break;
}
if(s[i][j]==str[j]){ //如果一样就存入sum(你可以不写这个判断 因为如果不一样了你已经退出了 所以这个if语句可写可不写)
sum+=s[i][j];
}
}
if(sum==""){ //如果sum是空的 说明这两个字符串没有公共前缀,那所有的字符串就没有公共前缀了,所以输出-1就可以结束程序了
cout<<"-1";
return 0;
}
if(ans.length()>sum.length()){ //如果这个公共前缀更短 那我们只能取这个
ans=sum;
}
}
cout<<ans; //输出最长公共前缀
return 0;
}
第二题:差不多先生
Description
差不多先生觉得任何事差不多就行了,比如让他比较两个长度不超过 100 的小写字母构成的字符串 s1,s2s1,s2,他就觉得只要每个字母分别在 s1,s2s1,s2 中出现的次数之差的绝对值小于等于一个整数 kk,就可以认为它们差不多相等啦!
下面请你来看看,对于给出的字符串,差不多先生的判断是什么?
Format
Input
输入多行
每行分别输入两个字符串 s1,s2s1,s2,以及一个整数 k(1≤k≤10)k(1≤k≤10)
Output
对于每行输入,如果差不多先生会认为它们相等,就输出 Yes
,否则输出 No
。
Samples
输入数据 1
oooo zccz 4
oooo zccz 3
oooo zccz 2
输出数据 1
Yes
No
No
Hint
字符串 "oooo" 中有 4 个 'o' ,但是 "zccz" 中有 0 个 'o',两者之差为 4 。
Limitation
1s, 1024KiB for each test case.
思路:
这个数据范围也很小,应该和第一题一样也是考察基本功,当时看到规模就直接打算无脑循环遍历了。
最直接的方法是可以统计两个字符串每一个字母出现的次数,然后判断是不是不超过k。这里要注意的是有多组数据输入,所以每一次记得要把标记变量和数组都清零。
代码(含注释):
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int cnt1[30],cnt2[30],x;
int main ()
{
while(cin>>s1>>s2>>x){ //多组数据输入
//记得要把三个计数的数组变量都清零,不然答案会错
int fg=0;
memset(cnt1,0,sizeof(cnt1));
memset(cnt2,0,sizeof(cnt2));
for(int i=0;i<s1.length();i++){ //记录第一个字符串每一个字符出现的次数
cnt1[s1[i]-'a'+1]++; //如果这里的下标不+1的话也可以 只要把最后一个循环改成从0-25就行了
}
for(int i=0;i<s2.length();i++){ //记录第二个字符串每一个字符出现的次数
cnt2[s2[i]-'a'+1]++; //如果这里的下标不+1的话也可以 只要把最后一个循环改成从0-25就行了
}
for(int i=1;i<=26;i++){
if(abs(cnt1[i]-cnt2[i])>x){ //如果有任意一个字符的差值小于给的值,那就输出No
cout<<"No"<<endl; //多组数据 记得换行
fg=1;
break; //这里一定要记得break 不然如果有多个字符出现的次数超过了就会输出多次No(我一开始就是这么错的qwq)
}
}
if(!fg){ //如果没有任何一个字符是超过给定的值的那就输出Yes
cout<<"Yes"<<endl; //多组数据 记得换行
}
}
return 0;
}