子集生成问题-一道笔试题目

当天在北邮,参加了笔试。

部分题目如下:

编程题目:给定一段字符串,如“ab*cd”,可将 *  替换成 0  或者  1 ,输出所有可能情况?
正确思路:首先统计字符串里是否存在*, 有多少个?
void gen_dfs(string &s1, vector<string> &res, int start, int bgn, int num)
{
   for(int i = start; i < s1.size(); i++)
   {
     if(s1[i] == '*')
     {
       s1[i] = '0';
      gen_dfs(s1, res, i+1, bgn+1, num);
      s1[i] = '1';
     gen_dfs(s1, res, i+1, bgn+1, num);
     s1[i] = '*';                                                 /*  注意,必须替换回  * ,否则得不到正确结果! */
     }
  }
   if(bgn == num && i == s1.size())            /*  注意,必须在这边判断 是否已经替换完毕?  */
     res.push_back(s1);
}

vector<string> gen_result(string &s1)
{
    vector<string> res;
    if(s1.empty())
      return res;
    int num = 0;
    for(int i = 0; i < s1.size(); i++)
    {
       if(s1[i] == '*')
         num++;
    }
   if(num == 0)
     return res;
   gen_dfs(s1, res, 0, 0, num);
   return res;
}


上述算法采用递归思想,如果采用“迭代”,该怎么做?
答案:“增量构造法”,参考leetcode的subsets题目。具体代码如下:

/* a string contains *, replace * with 1/0, iteratively */
vector<string> replaceString(string str)
{
  vector<string> res;
  vector<int> temp;
  if(str.empty())
    return res;
  int num = 0;
  for(int i = 0; i < res.size(); i++)
    num++;
  if(num == 0)
    return res;
  for(int i = 0; i < str.size(); i++)
   {
     if(str[i] == '*')
      {
        str[i] = '0';
        temp.push_back(i);
      }
   }
  res.push_back(str);           /* 第一步,首先把“*”全部替换成0,然后将此字符串压入res */
  while(!temp.empty())       /* 增量构造法 */
  {
    res.reserve(res.size() * 2);            /* 首先扩容res的容量 */
    copy(res.begin(), res.end(), back_inserter(res));           /* 将res的前半部分元素,拷贝到后半部分 */
    auto ite = res.begin() + res.size()/2 - 1;
    for(; ite != res.end(); ite++)
      (*ite)[temp[temp.size()-1]] = '1';              /* 替换res后半部分元素的一个字符,这里从后往前 */
    temp.erase(temp.end()-1, temp.end());            /*  temp里存放的是“*”在原字符串的位置 */
  }
  return res;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值