c++ 二维字符矩阵,字符串查找

这个项目一个区块链合作项目方发过来的水平测试题目,题目要求是:输入去掉空格,转换为大写字母,横向、纵向、对角线,以及相反方向去匹配,是否匹配到字符串。

设计方法有两种:

  • 字符比较
  • 字符串比较

我们采用的是第二种方法。字符串比较是一个调用,那么任务就具体到了各个方向字符串的生成:
横向、纵向、对角线皆可生成字符串。

简单粗暴上代码:


#include <iostream>
#include <algorithm>
#include <string>


using namespace std;


bool find_(string & str, string & key)
{
	// 正向字符串匹配
	if (str.find(key) != string::npos) {
		return true;
	}

	// 反向字符串匹配
	reverse(str.begin(), str.end());
	if (str.rfind(key) != string::npos) {
		return true;
	}

	return false;
}

/*
compiler command in linux:	g++ -std=c++11 search.cpp -o search

*/
int main(int argc, char **argv)
{
	const int ROWS = 5;
	const int COLUMNS = 5;
	char matrix[ROWS][COLUMNS] = {  {'C', 'O', 'A', 'S', 'T'},
					{'X', 'O', 'L', 'O', 'E'},
					{'E', 'M', 'A', 'I', 'A'},
					{'L', 'S', 'O', 'T', 'M'},
					{'T', 'N', 'A', 'X', 'O'}};
#if 0
	string str;
	getline(cin,str);
	cout << str << endl;
#endif

	//cout << "argc=" << argc << endl;
	if (argc < 2) {
		cout << "usage:" << argv[0] << " input string" << endl;
	}

	// 从cli获取目标字符串,并转换为大写
	string key;
	for (auto i = 1; i<argc; i++) {
		key += argv[i];
	}
	transform(key.begin(), key.end(), key.begin(), ::toupper);
	//cout << "key:" << key << endl;	

	// 检测字符串长度是否合法
	if (key.length() > ROWS || key.length() > COLUMNS) {
		cout << "your key more than max " << (ROWS > COLUMNS ? ROWS : COLUMNS) << " bytes" << endl;
	}

	// 横向检测
	for (auto i=0; i<ROWS; i++) {
		string str(&matrix[i][0], COLUMNS);
		//cout << str << endl;
		if (find_(str, key)) {
			cout << "Found" << endl;
			return 0;
		}
	}	

	// 纵向检测
	for (auto i=0; i<COLUMNS; i++) {
		string str;
		for (auto j=0; j<ROWS; j++) {
			str += matrix[j][i];
		}
		//cout << str << endl;

		if (find_(str, key)) {
			cout << "Found" << endl;
			return 0;
		}
	}

	// 沿主对角线方向,从右上角打印到左下角
	int x, y;
	x = 0;
	y = ROWS - 1;
	while (x != ROWS) {
		string str;
		for (int i = x, j = y; i <= ROWS - 1 && j <= ROWS - 1; i++, j++) {
			str += matrix[i][j];
		}
		
		if (find_(str, key)) {
			cout << "Found" << endl;
			return 0;
		}

		if (y > 0) {
			y--;
		}
		else {
			x++;
		}
	}

	// 沿副对角线方向,从左上角打印到右下角
	x = 0;
	y = 0;
	while (x < ROWS) {
		string str;
		for (int i = x, j = y; i <= ROWS - 1 && j >= 0; i++, j--) {
			str += matrix[i][j];	
		}

		if (find_(str, key)) {
			cout << "Found" << endl;
			return 0;
		}

		if (y < ROWS - 1) {
			y++;// 先往右走
		}
		else {
			x++;// 往右走不动了再往下走
		}
	}	

	cout << "Not found" << endl;
	return 0;
}

执行效果:

[root@izwz93atpalb56zydy9bpyz case1]# ./search XOL
Found
[root@izwz93atpalb56zydy9bpyz case1]# ./search OLox
Found
[root@izwz93atpalb56zydy9bpyz case1]# ./search XMOX
Found
[root@izwz93atpalb56zydy9bpyz case1]# ./search OTA
Found
[root@izwz93atpalb56zydy9bpyz case1]# ./search OTAO
Found
[root@izwz93atpalb56zydy9bpyz case1]# ./search Eio
Found
[root@izwz93atpalb56zydy9bpyz case1]# ./search tsao
Found
[root@izwz93atpalb56zydy9bpyz case1]# ./search oast
Found
[root@izwz93atpalb56zydy9bpyz case1]# 
发布了61 篇原创文章 · 获赞 63 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/jacky128256/article/details/104083770