题目的主要信息:
判断短字符串S中的所有字符是否在长字符串T中全部出现。
方法一:
逐行输入两个字符串S,T。用flag标志字符是否出现,遍历一遍S,逐个判断S中的每个字符是否能在T中找到,使用的函数是find函数,若没找到,find函数返回的是npos,flag置为false。最后flag的值即为结果。 具体做法:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string str1;
string str2;
while (getline(cin, str1), getline(cin, str2))//逐行输入
{
bool flag = true;
for (int i = 0; i < str1.size(); i++)
{
if (str2.find(str1[i]) == str2.npos)//判断字符str1[i]是否在str2中出现
{
flag = false;
break;
}
}
if (flag)//若有字符在str2中没有出现,则flag为false
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
}
}
复杂度分析:
- 时间复杂度:,m为str1的大小,n为str2的大小,需要遍历一遍str1,且每次都调用了复杂度为的find函数。
- 空间复杂度:,只用了常数空间。
方法二:
遍历一遍str2,用count统计其中每个字符出现的次数,然后再遍历一遍str1,如果str1中的字符在count中的值为0,表示str2中没有这个字符,匹配失败。
具体做法:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string str1;
string str2;
while (getline(cin, str1), getline(cin, str2))//逐行输入
{
vector<int> count(26,0);//统计每个字符出现的次数
bool flag = true;
for (int i = 0; i < str2.size(); i++)//遍历str2,统计每个字符出现的次数
{
count[str2[i]-'a']++;
}
for(int i = 0; i< str1.size(); i++)
{
if(count[str1[i]-'a']==0){//count为0表示str2中没有这个字符
flag = false;
break;
}
}
if (flag)//若有字符在str2中没有出现,则flag为false
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
}
}
复杂度分析:
- 时间复杂度:,m为str1的大小,n为str2的大小,需要遍历一遍str2,统计字符次数;遍历一遍str1判断是否在str2中出现。
- 空间复杂度:,只用了常数空间。