我试图实施该发现在所有的输入字符串普通字符数的较量代码。
我已经跳过的输入格式,但时间约束为0.5秒,所以我试图写的最佳代码。我遵循的方法是,在输入,我标志着与最小长度的字符串后遍历。然后,我遍历该字符串来提取每个字符,并检查它是否在所有字符串。有一次,我查了性格,我从所有的字符串删除,以节省时间。
#include<iostream>
#include<bits/stdc++.h>
#include<string>
using namespace std;
string s[205];
int t,len=0,n,k,count1,count2;
char a;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
len=0;
count1=0;
count2=0;
k=0;
for(int i=0;i<n;++i)
{
cin>>s[i];
if(i==0)
{
len = s[i].length();
}
else
{
if(s[i].length()<len)
{
len = s[i].length(); //Finding string with min length
k = i;
}
}
}
for(int i=0;i<s[k].length();++i)
{
count1 = 0;
a = s[k][i];
for(int j=0;j<n;++j)
{
auto found = s[j].find(a);
if(found==std::string::npos) //checking each character in all strings
break;
else
count1++;
}
if(count1==n) //If char is in all strings
{
count2++;
}
for(int j=0;j<n;++j)
{
if(s[j].find(a)!=std::string::npos)
{
s[j].erase(std::remove(s[j].begin(), s[j].end(), a), s[j].end()); //removing checked character from all strings
}
}
}
cout<<count2<<"\n"; //number of common characters
}
return 0;
}
代码跑了几个测试案例,但失败了一大半。请让我知道如果在代码中的逻辑缺陷。
我推荐了不同的方法。首先创建一个映射为每个字符串。统计每个字符的个数。总结所有的最小值。
E.g:
S1 = “abcaa”=> MAP1 = { '一个':3, 'B':1, 'C':1},S2 = “ababc”=> MAP2 = { '一个':2, 'B':2 , 'C':1}
=> 2个+ 1个+ 1公共字符。
取而代之的是地图,你可以使用数组,因为你可以一个char转换为int。
取而代之的是地图,你可以用一组,如果你不想重复计数。
S1 = “abcaad”=> MAP1 = { 'A', 'B', 'C', 'd'},S2 = “ababce”=> MAP2 = { 'A', 'B', 'C',' E'}
随着std::set_intersect您可以确定常用的字符。
#include <algorithm>
#include <iostream>
#include <set>
#include <string>
int main() {
unsigned int t;
std::cin >> t;
while (t--) {
unsigned int n;
std::cin >> n;
std::string temp;
std::cin >> temp;
std::set<char> intersect(temp.begin(), temp.end());
while (--n) {
std::cin >> temp;
std::set<char> tempSet(temp.begin(), temp.end());
std::set<char> newSet;
std::set_intersection(tempSet.begin(), tempSet.end(), intersect.begin(), intersect.end(), std::inserter(newSet, newSet.begin()));
intersect = newSet;
}
for (const auto c : intersect) {
std::cout << c;
}
std::cout << std::endl;
}
return 0;
}