版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42449444/article/details/94139227
给定任意一个较短的子串,和另一个较长的字符串,判断短的字符串是否能够由长字符串中的字符构建出来,且长串中的每个字符只能用一次。
一行数据包括一个较短的字符串S和一个较长的字符串T,用一个空格分隔。保证1<=|S|<=|T|<=100000。
如果短的字符串可以由长字符串中的字符构建出来,输出字符串 “true”,否则输出字符串 "false"。
a b
false
fj jfiejfiejfie
true
小米19年校招题还是有点东西的,我选了个比较简单的字符串题来练手。用map来记录字符串T中出现过的字符及其出现次数,用flag来判断能不能构建短字符串。题目要求用长字符串中现有的字符来构建短字符串,所以先无脑遍历一遍字符串T来记录能使用的字符及其能使用的次数,然后再无脑遍历一遍字符串S来判断能不能用现有的这些字符构建出短字符串。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string S,T; //短字符串S,长字符串T
while(cin >> S >> T)
{
map<char,int> m; //map用来记录字符串T中出现过的字符及其出现次数
bool flag = true; //用来判断能不能构建短字符串
for(auto it : T)
{
m[it]++;
}
for(auto it : S)
{
if(m[it])
{
m[it]--;
}
else
{
flag = false;
}
}
printf("%s\n", flag ? "true" : "false"); //不想写if-else了,直接来?:吧
}
return 0;
}