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
*/