[14]字符串匹配-百度2018秋

1.题目描述

牛牛有两个字符串 A 和 B,其中 A 串是一个 01 串,B 串中除了可能有 0 和 1,还可能有'?',B 中的'?'可以确定为 0 或者 1。 寻找一个字符串 T 是否在字符串 S 中出现的过程,称为字符串匹配。牛牛现在考虑所有可能的字符串 B,有多少种可以在字符串 A 中完成匹配。
例如:A = "00010001", B = "??"字符串 B 可能的字符串是"00","01","10","11",只有"11"没有出现在字符串 A 中,所以输出 3

  • 输入描述:
    输入包括两行,第一行一个字符串 A,字符串 A 长度 length(1 ≤ length ≤ 50),A 中每个字符都是'0'或者'1'。
    第二行一个字符串 B,字符串 B 长度 length(1 ≤ length ≤ 50),B 中的字符包括'0','1'和'?'。
  • 输出描述:
    输出一个整数,表示能完成匹配的字符串种数。
  • 输入示例:
    00010001
    ??
    
  • 输出示例:
    3
    

2.题目解析

将A从前到后依次遍历与B比较,遇到'?'特殊处理即可。使用穷举法。

3.参考答案

#include 
using namespace std;

int main() {
  string A;
  cin >> A;
  string B;
  cin >> B;
  
  set resset;
  for(int i=0;i

其他参考答案

#include 
using namespace std;
int main() {
  string A, B;
  cin >> A >> B;
  int ans = 0; 
  set s;
  for(int i=0;i!= A.size();++i) {// 遍历字符串A
    // 剩余的长度不够与B比较
    if(A.size()-i < B.size()) break;
    int pos = i;
    int flag = true;//标识匹配是否成功
    for(int j=0;j!=B.size();++j){
        if(A[pos] == B[j] || B[j] == '?'){
            pos++;// 比较下一个字符
        }else{
            flag = false;
            break;// 停止比较
        }
    }
    if(flag){
        s.insert(A.substr(i,B.size()));
    }
  }
  cout << s.size() << endl;
  return 0;
}

先切割字符串,存储效率更高。

#include 
using namespace std;
int main() {
  string A, B;
  cin >> A >> B;
  int ans = 0; 
  set s;
  for(int i = 0; i != A.size(); ++i) {// 遍历字符串A
    // 切出子串
    int j = i + B.size() - 1;
    if(j >= A.size()) continue;
    string cur = A.substr(i, j - i + 1);
    if(s.count(cur)) continue;
    s.insert(cur); // 记录子串
    // 把子串与B串比较
    bool flag = true;
    for(int k = 0; k < B.size(); k++) {
      if(cur[k] == B[k]) continue;
      if(B[k] == '?') continue;
      else {
          flag = false;
          break;
      }
    }
    if(flag) ans++; // 计数
  }
  cout << ans << endl;
  return 0;
}

牛客题目

你可能感兴趣的:([14]字符串匹配-百度2018秋)