[48无验证]字符编码-吉比特2018秋

2018-11-08  本文已影响16人  jdzhangxin

1.题目描述

将a,b,c,d分别编码为1,0,10,11,那么给定一个二进制串就可以对其进行解码。例如二进制串“10”可以解码为“ab”,也可以解码为“c”。给定一个二进制串,要求计算出该二进制串有多少种解码方式。(二进制串的长度不超过45,能设计出O(n)复杂度的算法更佳)

2.题目解析

3.参考答案

#include <iostream>
using namespace std;
int solve(int s, int e,string& str) {
  if (s >= e)
    return 1;
  int mid = (s + e) / 2;
  if (str[mid] == '1') { // 有两种解决方案
    return solve(s, mid,str) * solve(mid + 1, e,str) +
           solve(s, mid - 1,str) * solve(mid + 2, e,str);
  }else{ // 有一种解决方案
    return solve(s, mid,str) * solve(mid + 1, e,str);
  }
}
int main(){
  string str;
  cin >> str;
  printf("%d\n",solve(0,str.size()-1,str));
}
#include <iostream>
using namespace std;
int solve(int idx,string& str){
  if (idx == -1) return 1;
  if (idx == 0) return 1;
  if ('0' == str[idx-1]) { // 前一个数字是0,只有一种解决方案
    return solve(idx-1,str);
  } else { // 前一个数字是1,有两种解决方案
    return solve(idx-1,str) + solve(idx-2,str);
  }
}
int main(){
  string str;
  cin >> str;
  printf("%d\n",solve(str.size()-1,str));
}
上一篇 下一篇

猜你喜欢

热点阅读