目录
2018年3月美团春招笔试题 字符串距离
时间限制:C/C++语言 2000MS;其他语言 4000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
给出两个相同长度的由字符 a 和 b 构成的字符串,定义它们的距离为对应位置不同的字符的数量。如串”aab”与串”aba”的距离为 2;串”ba”与串”aa”的距离为 1;串”baa”和串”baa”的距离为 0。下面给出两个字符串 S 与 T,其中 S 的长度不小于 T 的长度。我们用|S|代表 S 的长度,|T|代表 T 的长度,那么在 S 中一共有|S|-|T|+1 个与 T 长度相同的子串,现在你需要计算 T 串与这些|S|-|T|+1 个子串的距离的和。
输入
第一行包含一个字符串 S。
第二行包含一个字符串 T。
S 和 T 均由字符 a 和 b 组成,1 ≤ |T| ≤ |S| ≤105 。
输出
输出对应的答案。
样例输入
aab
aba
样例输出
2
Hint
Input Sample 2
aaabb
bab
Output Sample 2
5
在样例 2 中,”aaa”与”bab”的距离为 2,”aab”与”bab”的距离为 1,”abb”与”bab”的距离为 2,
所以最后答案为 5。
这个题目的数据量是|T|<|S|<10^5
所以直接暴力的解法是O(|S|*|T|)肯定会超时的。
我的解法是O(|S|)的,肯定不会超时了。
关键词:反演
具体思路:对于T中的每个字符,都是要和S中的连续|S|-|T|+1个字符相比较的。
比如T中的第1个字符,要和S的前|S|-|T|+1个字符相比较
T中的第2个字符,要和S的第2个字符到第|S|-|T|+2个字符相比较
。。。。。。
每次统计T中的1个字符和S中的|S|-|T|+1个字符有多少个是不一样的,
当统计T中的下一个字符时,S中的|S|-|T|+1个字符只要往右移一步就行,就是去掉第一个字符,再在最后一个字符后面补一个新的字符。
代码:
<iostream>
#include<string.h>
using namespace std;
char s[100001], t[100001];
int main()
{
cin >> s >> t;
int a = 0, b = 0, ls = strlen(s), lt = strlen(t), su = 0;
for (int i = 0; i < ls - lt + 1; i++)if (s[i] == 'a')a++; else b++;
for (int i = ls - lt; i < ls; )
{
if (t[i - ls + lt] == 'a')su += b; else su += a;
if (s[i - ls + lt] == 'a')a--; else b--;
if (s[++i] == 'a')a++; else b++;
}
cout << su;
return 0;
}
满分通过
2018年3月美团春招笔试题 数字字符
时间限制:C/C++语言 2000MS;其他语言 4000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
在十进制表示中,任意一个正整数都可以用字符‘0’-‘9’表示出来。但是当‘0’-‘9’这些字符每种字符的数量有限时,可能有些正整数就无法表示出来了。比如你有两个‘1’ ,一个‘2’ ,那么你能表示出 11,12,121 等等,但是无法表示出 10,122,200 等数。
现在你手上拥有一些字符,它们都是‘0’-‘9’的字符。你可以选出其中一些字符然后将它们组合成一个数字,那么你所无法组成的最小的正整数是多少?
输入
第一行包含一个由字符’0’-‘9’组成的字符串,表示你可以使用的字符。
· 1 ≤字符串长度≤ 1000
输出
输出你所无法组成的最小正整数。
样例输入
55
样例输出
1
Hint
Input Sample 2
123456789
Output Sample 2
10
思路:
贪心
最后的答案要不就是10^n的形式,要不就是每一位都是相同的数字。
代码:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char c[1001];
int su = 0, num[10];
for (int i = 0; i < 10; i++)num[i] = 0;
cin >> c;
int len = strlen(c);
for (int i = 0; i < len; i++)num[c[i] - '0']++;
for (int i = 1; i <= 9; i++)if (!num[i])
{
cout << i;
return 0;
}
if (!num[0])
{
cout << 1 << 0;
return 0;
}
int minn = 10000;
for (int i = 0; i <= 9; i++)if (minn > num[i])minn = num[i];
for (int i = 1; i <= 9; i++)if (num[i] == minn)
{
while (minn--)cout << i ;
cout << i;
return 0;
}
cout << 1;
while (minn--)cout << 0;
cout << 0;
return 0;
}
满分通过