中级农民
- 积分
- 102
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-5-10
- 最后登录
- 1970-1-1
|
愿意与楼主讨论
#include <vector>
#include <iostream>
#include <algorithm>
#include <unordered_set>
#include <sstream>
#include <string>
using namespace std;
/*
题意: 给一个word的set,给一个句子,把所有该word左右加上tag(<b><\b>)注意必须是单词匹配,不能是substring,follow up是,如果要考虑一些比如复数s, 逗号这种,怎么做比较好
比如str=”ABC BC CD” set={“BC ”,”D”}
*/
/*
思路:遍历set,然后不停用find("")来查找,只要不是string::npos就行,然后前后插入这个<b></b>就行,然后i下个查找的位置是当前位置加上
<b>...(字符串长度)</b>的总长度,有无,结尾有都都无所谓
*/
class Solution {
public:
string helper(string &in,unordered_set<string> s){
string s1="<b>",s2="</b>";
for(auto a:s){
int i=0;//起始位置的下标
while(in.find(a,i)!=string::npos){
i=in.find(a,i);
int end=i+a.size();//</b>的位置
//先插入后半部分
in.insert(end,s2);
//再插入前部分
in.insert(i,s1);
//然后下个查找的其实位置
i+=s1.size()+a.size()+s2.size();
}
}
return in;
}
};
int main()
{
unordered_set<string> dic{"BC","SD"};
string str="ABC,BC CDE, BCU ESD BRSD CEGD D SD";
Solution *s=new Solution();
cout<<s->helper(str,dic);
return 0;
}
运行结果是:"A<b>BC</b>,<b>BC</b> CDE, <b>BC</b>U E<b>SD</b> BR<b>SD</b> CEGD D <b>SD</b>"; |
|