当前位置:   article > 正文

CCF-GESP计算机学会等级考试2024年3月四级C++T1相似字符串_相似字符串(2024年3月c++四级)

相似字符串(2024年3月c++四级)
试题名称 :相似字符串
问题描述
对于两个字符串 A 和 B,如果 A 可以通过删除一个字符, 插入一个字符, 修改一个字符变成B ,那么我们说 A 和 B 是相似的。
比如 apple 可以通过插入一个字符变成 applee ,可以通过删除一个字符变成 appe ,也可以通过修改一个字符变成 bpple ,因此 apple applee appe bpple 都是相似的。但 applee 并不能通过任意一个操作变成 bpple ,因此它们并不相似。
特别地,完全相同的两个字符串也是相似的。
给定 T 组 A,B,请你分别判断他们是否相似。
输入描述
第一行一个正整数 T。
接下来 T 行,每行两个用空格隔开的字符串 A 和 B 。
保证 T<=100 ,A,B 的长度不超过 50 。 保证 A 和 B 只包含小写字母。
输出描述
输出 T 行,对于每组 A,B,如果它们相似,则输出 similar ,否则输出 not similar
特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
样例输入 1
5
apple applee
apple appe
apple bpple
applee bpple
apple apple
样例输出 1
similar
similar
similar
not similar
similar

解析:

详见代码:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. bool isSimilar(string A, string B) {
  5. int m = A.size(), n = B.size();
  6. if (abs(m - n) > 1) return false;
  7. if (m == n) {
  8. int diff = 0;
  9. for (int i = 0; i < m; ++i) {
  10. if (A[i] != B[i]) {
  11. if (++diff > 1) return false;
  12. }
  13. }
  14. return diff <= 1;
  15. } else {
  16. string& shorter = (m < n) ? A : B;
  17. string& longer = (m < n) ? B : A;
  18. int i = 0, j = 0;
  19. int diff = 0;
  20. while (i < shorter.size() && j < longer.size()) {
  21. if (shorter[i] != longer[j]) {
  22. if (++diff > 1) return false;
  23. ++j;
  24. } else {
  25. ++i;
  26. ++j;
  27. }
  28. }
  29. return true;
  30. }
  31. }
  32. int main() {
  33. int T;
  34. cin >> T;
  35. while (T--) {
  36. string A, B;
  37. cin >> A >> B;
  38. if (isSimilar(A, B)) {
  39. cout << "similar" << endl;
  40. } else {
  41. cout << "not similar" << endl;
  42. }
  43. }
  44. return 0;
  45. }

另一种解法:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. bool isSimilar(string A, string B) {
  5. int m = A.size(), n = B.size();
  6. if (abs(m - n) > 1) return false;
  7. if (A==B) return true;
  8. int cnt=0;
  9. for(int i=0;i<min(m,n);i++){
  10. if (A[i]==B[i]){
  11. cnt++;
  12. }else{
  13. break;
  14. }
  15. }
  16. for(int i=m-1,j=n-1;i>=0&&j>=0;i--,j--){
  17. if (A[i]==B[j]){
  18. cnt++;
  19. }else{
  20. break;
  21. }
  22. }
  23. return cnt>=max(m,n)-1;
  24. }
  25. int main() {
  26. int T;
  27. cin >> T;
  28. while (T--) {
  29. string A, B;
  30. cin >> A >> B;
  31. if (isSimilar(A, B)) {
  32. cout << "similar" << endl;
  33. } else {
  34. cout << "not similar" << endl;
  35. }
  36. }
  37. return 0;
  38. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/397207
推荐阅读
相关标签
  

闽ICP备14008679号