题解 | #统计字符串中子串出现的次数#
统计字符串中子串出现的次数
https://www.nowcoder.com/practice/9eb684f845a446f3b121472de2ea75cd
解法1:三指针
#include <iostream> #include <cstring> using namespace std; int main() { char str[100] = { 0 }; char substr[100] = { 0 }; cin.getline(str, sizeof(str)); cin.getline(substr, sizeof(substr)); int count = 0; int str_len = strlen(str); int substr_len = strlen(substr); char *p1 = str; char *p2 = str; char *p3 = substr; // write your code here...... for ( ; p1 != str + str_len; ++p1) { if (*p1 == *substr) { for (p2 = p1 + 1, p3 = p3 + 1; p2 != p1 + substr_len; ++p2, ++p3)//(*p2和*p3已经相等了,所以初始化指针后移) { if (*p2 != *p3) break; } if (p2 == p1 + substr_len) { ++count; } p3 = substr; } } cout << count << endl; return 0; }
第一次写使用了三个指针如上所示,看了一下评论,感觉还是下标索引写法来得直接一点,毕竟不需要额外定义其他的变量,写法是评论区的一位同学的,思路其实差不多,参见解法2。
解法2:下标索引
#include <iostream> #include <cstring> using namespace std; int main() { char str[100] = { 0 }; char substr[100] = { 0 }; cin.getline(str, sizeof(str)); cin.getline(substr, sizeof(substr)); int count = 0; // write your code here...... for (int i = 0; str[i] != '\0'; i++) { //遍历字符串str bool flag = true; for (int j = 0; substr[j] != '\0'; j++) { //以字符串str的i位置为起点,每次同步遍历substr长度 if (str[i + j] != '\0' && str[i + j] == substr[j]) //比较每个字符 continue; else { flag = false; //不相同,这一次不是子串 break; } } if (flag) count++; } cout << count << endl; return 0; }
C++题解 文章被收录于专栏
记录在牛客网用C++刷题的题解思路