题目描述
给一个字符串 T T T,问在字符串 T T T 中可以包含最多多少个不重叠的字符串 S S S。
字符串中的每个字符为小写或者大写字母。
输入格式
第一行输入一个字符串 S S S。
第二行输入一个字符串 T T T。
输出格式
输出一行,包括一个整数表示答案。
输入样例:
Aba
Abababa
输出样例:
1
数据范围
1 ≤ ∣ T ∣ ≤ 1 0 6 , 1 ≤ ∣ S ∣ ≤ 1 0 5 。 1\leq|T|\leq10^6, 1\leq|S|\leq10^5。 1≤∣T∣≤106,1≤∣S∣≤105。
解题思路
这道题考的是贪心
贪心策略是:从前往后遍历,如果这个字符串能跟
t
t
t匹配,那么就把答案
+
1
+1
+1
我们可以定义一个指针
j
j
j表示在
T
T
T中遍历到了第几个位置
定义一个指针
i
i
i表示在
S
S
S中遍历到了第几个位置
i
f
if
if
S
[
i
]
=
T
[
j
]
S[i] = T[j]
S[i]=T[j] 说明可以继续往下匹配,就执行
j
+
+
j++
j++
i
f
if
if
S
[
i
]
=
T
[
0
]
S[i] = T[0]
S[i]=T[0]
a
n
d
and
and
S
[
i
]
≠
T
[
j
]
S[i] \neq T[j]
S[i]=T[j] 说明把这个位置做为开头,继续往下匹配
否则
j
=
0
j=0
j=0
时间复杂度
O ( n ) O(n) O(n)
Ac Code
#include <bits/stdc++.h>
#define x first
#define y second
#define MP make_pair
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef unsigned long long ULL;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
int main()
{
string a, b;
cin >> a >> b;
int res = 0;
for (int i = 0, j = 0; i < b.size(); i ++ )
{
if (b[i] == a[j]) j ++ ;
else if (b[i] == a[0]) j = 1;
else j = 0;
if (j == a.size())
{
res ++ ;
j = 0;
}
}
cout << res << endl;
return 0;
}