问题
input:关系R(A,B,C,D)以及R的FD(函数依赖)集,如AB->C,D->A,C->D
inout:求出{A,B}的闭包
源码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> DivideFD(vector<string> fd){
vector<string> v1;
for(size_t i=0;i<fd.size();i++){
//我只能用迭代器的方式截取字符串吗?
//利用find()实现
//找到'>'出现的位置ok
auto position1=fd[i].find(">")+1;
auto position2=fd[i].find("-");
string sRight(fd[i].begin()+position1,fd[i].end());
//cout<<sRight<<endl;
string sLeft(fd[i].begin(),fd[i].begin()+position2);
//cout<<sLeft;
if(sRight.size()>1){//开始分割。
for(size_t j=0;j<sRight.size();j++){
string s1="->";
string sLeft1=sLeft;
sLeft1+=s1+sRight[j];
//cout<<sRight[j]<<endl;
v1.push_back(sLeft1);
//cout<<v1[i]<<endl;
}
}else{
v1.push_back(fd[i]);
//cout<<v1[i]<<endl;
}
}
return v1;
}
bool HaveIt(string s,string s1){
for(size_t i=0;i<s1.size();i++){
//cout<<s1[i]<<" "<<s.find(s1[i])<<endl;
if(s.find(s1[i])>=s.size()){//没找到返回false
return false;
}
}
return true;
}
int main(){
vector<string> fd;
int numFD=0;
cin>>numFD;
for(int i=0;i<numFD;i++){
string s11;
cin>>s11;
fd.push_back(s11);
}
string s;
cin>>s;
//转换为一般输入形式
//求{A,B}+
vector<string> v1=DivideFD(fd);
// for(auto v11:v1){//测试分割函数
// cout<<v11<<endl;
// }
for(int i=0;i<2;i++){
for(auto v11:v1){
auto position1=v11.find(">")+1;
auto position2=v11.find("-");
string sRight(v11.begin()+position1,v11.end());
string sLeft(v11.begin(),v11.begin()+position2);
if(HaveIt(s,sLeft)&&!HaveIt(s,sRight)){
s+=sRight;
}
}
}
cout<<s<<endl;
system("pause");
}