11.4(28. 实现strStr()-----36. 有效的数独)

本文介绍了一种高效的字符串匹配算法实现,用于查找子字符串,并详细解释了其工作原理和代码实现。此外,还探讨了一种有效的方法来验证数独的有效性,包括行、列和九宫格的检查,提供了完整的程序代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

28. 实现strStr()(通过)

效率:99.25%
思路:
程序代码:
class Solution {
public:
	int strStr(string haystack, string needle) {
		int m = haystack.size(), n = needle.size();
		if (n== 0) return 0;
		int i = 0, j = 0;//分别表示两个串的位置
		while (i < m&&j < n) {
			if (haystack[i] == needle[j]) {
				j++;
				if (j == n) return i - n + 1;
			}
			else if (j > 0 && j < n) {
				i=i-j;//注意这里需要往回调一个
				j = 0;
			}
			i++;
		}
		return -1;//如果执行完了循环还是不满足条件,直接返回错误
	}
};


int main() {
	string a, b;
	cin >> a >> b;
	Solution bb;
	cout << bb.strStr(a,b);
	return 0;
}


这个效率有点高,不可思议,我感觉比较高的效率应该是使用某个很著名的near数组来寻找子串

程序代码(尝试方法二):

36. 有效的数独(通过)

思路:分别检查行、列以及三行三列的位置
效率:40+%
程序代码:
class Solution {
public:
	bool isValidSudoku(vector<vector<char>>& board) {
		
		return A(board) && B(board) && C(board);//构造三个函数,都是很基础的函数
	}

	bool A(vector<vector<char>>& board) {//对列进行访问
		for (int i = 0; i < 9; i++) {
			map<char, int> map;//每次都重新进行初始化
			for (int j = 0; j < 9; j++) {
				if (map[board[i][j]] == 1) return false;
				if (board[i][j] != '.')
					map[board[i][j]] = 1;
			}
		}
		return true;
	}

	bool B(vector<vector<char>>& board) {//对行进行访问
		for (int j = 0; j < 9; j++) {
			map<char, int> map;//每次都重新进行初始化
			for (int i = 0; i < 9; i++) {
				if (map[board[i][j]] == 1) return false;
				if (board[i][j] != '.')
					map[board[i][j]] = 1;
			}
		}
		return true;
	}
	bool C(vector<vector<char>>& board) {//对小方格进行访问
		for (int i = 0; i < 9; i=i+3) {
			for (int j = 0; j < 9; j=j+3) {
				int a1 = i, a2 = i + 2, b1 = j, b2 = j + 2;//分别表示几个边界
				map<char,int> map;//这里进行初始化
				for (int k = a1; k <= a2; k++) {
					for (int t = b1; t <= b2; t++) {
						if (map[board[k][t]] == 1) return false;
						if (board[k][t] != '.')
							map[board[k][t]] = 1;
					}
				}
			}
		}
		return true;
	}

};


int main() {
	
	vector<vector<char>> board(9,vector<char>(9,'.'));///尝试一下是不是可以这样赋值
	for (int i = 0; i < 9; i++) {
		for (int j = 0; j < 9; j++) {
			cin >> board[i][j];
		}
	}//完成赋值
	Solution bb;
	cout << bb.isValidSudoku(board);
	return 0;
	
}


/*
5 3 . . 7 . . . .
6 . . 1 9 5 . . .
. 9 8 . . . . 6 .
8 . . . 6 . . . 3
4 . . 8 . 3 . . 1
7 . . . 2 . . . 6
. 6 . . . . 2 8 .
. . . 4 1 9 . . 5
. . . . 8 . . 7 9


*/
补充一下关于哈希表的相关知识
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱码仕1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值