题解 | #统计字符串中子串出现的次数#
统计字符串中子串出现的次数
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++刷题的题解思路
查看20道真题和解析