题目描述
给定a-z,26个英文字母小写字符串组成的字符串A和B,其中A可能存在重复字母,B不会存在重复字母,现从字符串A中按规则挑选一些字母可以组成字符串B。
挑选规则如下:
- 同一个位置的字母只能挑选一次,
- 被挑选字母的相对先后顺序不能被改变,
- 求最多可以同时从A中挑选多少组能组成B的字符串。
输入描述
输入为2行,第一行输入字符串a,第二行输入字符串b,行首行尾没有多余空格
输出描述
输出一行,包含一个数字,表示最多可以同时从a中挑选多少组能组成b的字符串,行末没有多余空格
用例
输入 | badc bac |
输出 | 1 |
说明 | 无 |
解题思路分析
题目要求从字符串A
中按顺序挑选字符,组成字符串B
,以求在满足挑选规则的前提下,能够从A
中挑选出多少组能组成B
的字符串。
挑选规则如下:
- 同一个位置的字母只能挑选一次。
- 被挑选字符的相对先后顺序不能被改变。
输入描述:
- 输入为2行,第一行输入字符串
a
,第二行输入字符串b
,行首行尾没有多余空格。
输出描述:
- 输出一行,包含一个数字,表示最多可以同时从
a
中挑选多少组能组成b
的字符。
解题步骤:
-
双指针法:
- 使用两个指针,分别指向字符串
A
和字符串B
的起始位置。 - 遍历字符串
A
,尝试用B
中的字符进行匹配。 - 当匹配完成一个
B
时,增加计数,并将B
的指针重置,继续在A
中匹配下一个B
。
- 使用两个指针,分别指向字符串
-
匹配过程:
- 如果
A
的当前字符与B
的当前字符相同,移动B
的指针。 - 无论是否匹配成功,都移动
A
的指针。 - 当
B
的指针移动到B
的末尾时,表示成功匹配一个B
,将计数器加一,并重置B
的指针。
- 如果
C++程序实现
#include <iostream>
#include <string>
using namespace std;
int countMatches(string a, string b) {
int aLen = a.length();
int bLen = b.length();
int i = 0, j = 0;
int count = 0;
while (i < aLen) {
if (a[i] == b[j]) {
j++;
if (j == bLen) {
count++;
j = 0;
}
}
i++;
}
return count;
}
int main() {
string a, b;
cin >> a >> b;
int result = countMatches(a, b);
cout << result << endl;
return 0;
}
Python程序实现
def count_matches(a, b):
a_len = len(a)
b_len = len(b)
i, j = 0, 0
count = 0
while i < a_len:
if a[i] == b[j]:
j += 1
if j == b_len:
count += 1
j = 0
i += 1
return count
# 输入
a = input().strip()
b = input().strip()
# 计算并输出结果
result = count_matches(a, b)
print(result)
解释
上述代码通过双指针的方法在a
中寻找b
的所有匹配。每当找到一个完整的b
时,计数器加1,并重置b
的指针。无论是否匹配成功,a
的指针总是移动,以确保遍历整个a
字符串。这种方法有效地解决了问题,并确保了复杂度在可接受的范围内。