题解 | #配置文件恢复#
配置文件恢复
https://www.nowcoder.com/practice/ca6ac6ef9538419abf6f883f7d6f6ee5
#include <iostream> #include <vector> #include <string> using namespace std; //把输入的命令拆成两个单词判断,之前想的时都存在一个vector<string>里,原命令行中用二维的vector存储,实际上这两种再后面分别判断两个单词时都不好遍历 //因为输入的单词还要从空格拆开,又要写函数,二维数组遍历时[]加上[],更难判断。不如直接用两个字符串变量分别接收第一个和第二个单词(遇到没有第二个单词的情况就 //直接存成“”),而命令行也用vector<pair<string,string>>来存,到时候直接写成first second就可以了 //依次判断flag1是否存在于first中(且POS==0),flag2是否存在于second中,POS=0。两个都为真,说明能匹配的个数+1.最后要看总的能匹配的个数,必须=1才行,多了也不可以) int main() { vector<pair<string,string>>dic={ {"reset",""},{"reset","board"}, {"board","add"},{"board","delete"},{"reboot","backplane"},{"backplane", "abort"}}; vector<string>dic1{"reset what","board fault","where to add","no board at all","impossible","install first"}; int dlen = dic.size(); string s; while (getline(cin, s)) {//接收字符串后再从' '处拆成两个存 string s1="",s2=""; int pos=0; while(pos<s.size()&&s[pos]!=' '){ pos++;} s1=s.substr(0,pos); if(pos!=s.size()){s2=s.substr(pos+1,s.size()-pos-1);}//如果有第二个词,就用s2存,如果没有第二个词,s2就还等于“ ”。 int count=0; //匹配上的个数 string result; for(int i=0;i<dlen;i++){ int flag1=dic[i].first.find(s1)==0?1:0;//第一个单词能否匹配上 int flag2=0; if(s2!=""){//s2有单词时,看看能不能在命令的second中找到s2,pos=0 flag2=dic[i].second.find(s2)==0?1:0; }//如果s2="",且命令行的second也=““,说明就没有第二个单词,flag2直接=1就可以 else if(s2==""&&dic[i].second==""){flag2=1;} if(flag1==1&&flag2==1){ count++;//匹配上的次数+1 result=dic1[i];//记录一下匹配上的这个命令时什么 } } if(count==1){cout<<result<<endl;}//当且仅当只能匹配上一个命令时,才输出 else{cout << "unknown command" << endl;} } return 0; }