题目描述
一个鲜为人知的事实是,奶牛拥有自己的文字:「牛文」。牛文由 26 个字母 'a' 到 'z' 组成,但是当奶牛说牛文时,可能与我们所熟悉的 'abcdefghijklmnopqrstuvwxyz' 不同,她会按某种特定的顺序排列字母。
为了打发时间,奶牛 Bessie 在反复哼唱牛文字母歌,而 Farmer John 好奇她唱了多少遍。
给定一个小写字母组成的字符串,为 Farmer John 听到 Bessie 唱的字母,计算 Bessie 至少唱了几遍完整的牛文字母歌,使得 Farmer John 能够听到给定的字符串。Farmer John 并不始终注意 Bessie 所唱的内容,所以他可能会漏听 Bessie 唱过的一些字母。给定的字符串仅包含他记得他所听到的字母。
输入格式(从终端/标准输入读入):
输入的第一行包含 26 个小写字母 'a' 到 'z' 的牛文字母表顺序。下一行包含一个小写字母组成的字符串,为 Farmer John 听到 Bessie 唱的字母。字符串的长度不小于 11 且不大于 10001000。
输出格式(输出至终端/标准输出):
输出 Bessie 所唱的完整的牛文字母歌的最小次数。
输入样例:
abcdefghijklmnopqrstuvwxyz mood输出样例:
3样例解释:
在这个样例中,牛文字母表与日常的字母表的排列一致。
Bessie 至少唱了三遍牛文字母歌。有可能 Bessie 只唱了三遍牛文字母歌,而 Farmer John 听到了以下被标记为大写的字母。
abcdefghijklMnOpqrstuvwxyz abcdefghijklmnOpqrstuvwxyz abcDefghijklmnopqrstuvwxyz测试点性质:
- 测试点 2-5 中,牛文字母表与日常的字母表相同。
- 测试点 6-10 没有额外限制。
本题主要考察知识点,字符串、遍历、枚举、周期、取模%。
本题难度:入门题,语法熟练,有一定算法基础。
思路:
固定当前第二个字符串,从头开始去和第一个输入的字符串中去比对,比对过程中注意两点:
1. 找到相同的字符之后,对于第一个字符串str1应当立刻退出,并且从下一个字符开始继续与第二个字符串str2中的下一个字符比对;
2. 如果没有找到相同的字符,则对于第一个字符串str1应当继续向后遍历,但是一定会面临字符串会遍历到结束的情况,所以考虑到增加字符串长度可能会越界,所以采用%方法搞定类似的周期行为。
接下来是一份枚举法的题解
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main(){
//定义两个字符串
string str1, str2;//奶牛哼唱的歌 Bessie听到的歌
cin >> str1 >> str2;
int len1 = str1.length(), len2 = str2.length();
//固定str2中的一个字符,与str1中字符比对
int j = 0;//用一个全局变量j在str1字符串中遍历
for (int i = 0; i < len2; i++){
//j始终++
for (; ; j++){
//如果当前str1中字符为str2中的某个字符,则可退出去检验str2中的下一个字符
if (str1[j % len1] == str2[i]){
j++;
//因为退出就不会j++了,保证下一个str1的字符对应的是下一个str2的字符,不重复判断
break;
}
}
}
//j为为了找到str2中字符一共遍历了多少个str1中的字符数量
cout << ceil((double)j / len1);
return 0;
}
做题感受:
USACO的题目的确是考察的很全面,测试点出的让人很有思考性,能够循着测试点搞定基础思路。