打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
精选算法题(4)——字符串比较

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

好久没做题目了,近期刷抖音碰到一个题目,乍一看不是很难,但是手生了,就写个玩玩,大家轻喷。

两个字符串比较,如abcdefg和25abdfxx,返回:位置0多出:25;位置2缺少:c;位置4缺少:e;位置6错误,应为g。

解题思路:

我看很多人说双指针法、动态规划能解,我暂时没想那么多,就用了简单的双循环+滑动窗口。

  1. 取idx1和idx2作为滑动窗口起点。以字符串1为基准,遍历字符串2寻找相同的字符。
  2. 当两个字符一致时,判断下j和idx2的大小情况,如果j大且i和idx1一致,说明字符串2相同字符前面有一段字符是多出的。之后,将idx1加1,再使idx2等于j+1,这样可以使两个字符串的滑动窗口从相同字符后的一个位置开始。
  3. 如果i大于idx1,且j和idx2一致,同理,说明字符串1相同字符前面缺少了一段字符。之后,idx2加1,idx1等于i+1即可。
  4. 如果i大于idx1,j也大于idx2,说明两个字符串相同字符前,各有一段不相同字符,即匹配错误。
  5. 若上述三个条件都不满足,那就说明碰到了连续相同字符串。令idx1和idx2都加1,跳过即可。
  6. 如果i走到最后都没找到匹配对象,则从idx1到字符串1结尾所有字符都匹配失败了。

测试代码:

#include <iostream>
#include <string>
using namespace std;

void compareStrings(std::string str1, std::string str2) {
	int len1 = str1.length();
	int len2 = str2.length();
	
	int idx1 = 0;
	int idx2 = 0;
	for (int i = 0; i < len1; ++i) {
		for (int j = idx2; j < len2; ++j) {
			if (str1[i] == str2[j]) {
				if (j > idx2 && i == idx1) {
					cout << "位置" << i << "多出:" << str2.substr(idx2, j - idx2) << endl;
					idx1++;
					idx2 = j + 1;
				}
				else if (i > idx1 && j == idx2) {
					cout << "位置" << idx1 << "缺少:" << str1.substr(idx1, i - idx1) << endl;
					idx1 = i + 1;
					idx2++;
				}
				else if (i > idx1 && j > idx2) {
					cout << "位置" << idx1 << "错误,应为:" << str1.substr(idx1, i - idx1) << endl;
					idx1 = i + 1;
					idx2= j + 1;
				}
				else{
					idx1++;
					idx2++;
				}
				break;
			}			
		}
		if (i == (len1 - 1) && (idx1 < len1)) {
			cout << "位置" << idx1 << "错误,应为:" << str1.substr(idx1, i - idx1 + 1) << endl;
		}
	}
}

int main() {
	std::string str1 = "abcdefg";
	std::string str2 = "25abdfxx";
	cout << "字符串1:" << str1 << endl;
	cout << "字符串2:" << str2 << endl;
	compareStrings(str1, str2);
	return 0;
}

测试结果:

字符串如题目要求时,结果如下,可以发现是满足的。

加几个字符再试试,依然可行。

中间内容再打乱一些,暂无问题。

多几个重复字符,按照我的逻辑,输出结果是对的,但不知道题目是不是这意思。

       如果代码有什么需要改进的或者有什么bug,欢迎评论留言,我会及时更正以免误导他人~

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++字符串分割
C++ String
C++ string详解
cin深入分析(上) - cin输入操作处理(转)_斯莱克威
C++字符串与指针
C++之标准设备IO操作流
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服