目录
牛客_分解因数(简单模拟)
解析代码
牛客_分解因数(简单模拟)
字符串计数_美团笔试题_牛客网
解析代码
题目意思:按照字典序列:找到s1和s2之间长度在len1和len2范围内的字符串个数。直接做不好处理,此处需要转化思路,找到一个合适的模型:因为从‘a’~'z',刚好有26个字母,因此可以将s1 和s2看成是26进制数据,题目就变得简单了,将其转化为:从s1和s2之间有多少个不同数字,最后求解出长度不同的数组的个数即可。
思路:
- 循环接受收入,保证所有测试用例可以验证到。
- 将s1和s2补齐到len2位,因为在字典序列中s1比s2靠前,因此s1后序所有位补'a',s2后 补'z'+1。
- 确认s1和s2两个字符串每个字符位置上的差值。
- 确认len1和len2之间不同字符的个数。
- 注意输出时需要模1000007。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#define N 1000007
using namespace std;
int main() // 补齐字符串,按照26进制进行计算
{
string s1, s2;
int len1 = 0, len2 = 0;
while (cin >> s1 >> s2 >> len1 >> len2)
{
// 将该字符串看成是26进制数,为了简单起见,将s1和s2补长到len2长度
// 注意:s2补的是'z'+1, 因为'z' - 'a' = 25
s1.append(len2 - s1.size(), 'a');
s2.append(len2 - s2.size(), (char)('z' + 1));
vector<int> arr(len2); // 确认s1和s2的两个字符串每个位置上的差值
for (int i = 0; i < len2; ++i)
{
arr[i] = s2[i] - s1[i];
}
int result = 0; // 确认len1和len2之间可组成的不同字符串的个数
for (int i = len1; i <= len2; ++i)
{
for (int k = 0;k < i;k++)
{
result += arr[k] * pow(26, i - 1 - k);
}
}
//所有字符串最后都不包含是s2自身,所以最后要减1;
cout << (result - 1) % N << endl;
}
return 0;
}