leetcode 246 中心对称数问题

// 中心对称数问题
// 中心对称数指旋转180°之后和自己完全对称的数
// 能够中心对称的数字包括{{0:0}, {1:1}, {6:9}, {9:6}, {8:8}}
// 给定a,b,求[a,b]之间有多少个中心对称数
// 深度优先搜索,触底返回
#include<iostream>
#include<string>
#include<vector>
using namespace std;

class Solution{
private:
  vector<string> same{"0", "1", "8"};
  vector<pair<char,char>> two{{'0','0'}, {'1','1'}, {'6','9'}, {'9','6'}, {'8','8'}};
  int cnt = 0;
public:
  int strobogrammaticInRange(string low, string high){
    int n1 = low.size();
    int n2 = high.size();
    for (int i=n1;i<=n2;i++){
      DFS(low, high, i, "");
    }
    return cnt;
  }
  void DFS(string& low, string& high, int n, string str){ //n表示一共有几位数
    if (n==0 &&stol(str)>=stol(low) &&stol(str)<=stol(high)) {
      cnt++; cout<<str<<endl;return;
    }
    if (n%2==1) {
      for (auto val:same) DFS(low, high, n-1, val);
    }
    if (n==0||n%2==1) return; // n==0但不满足范围条件,直接返回;n为奇数已经在same里面搜索完了,也返回
    for (int i=(n==2?1:0);i<=4;i++){  //n是偶数,n==2时说明是最外面的两个数,不能是0
      DFS(low, high, n-2, two[i].first+str+two[i].second);
    }

  }
};

int main(){
  Solution s;
  int res = s.strobogrammaticInRange("10","10000");
  // cout<<res;
  return 0;
}

 

上一篇:AcWing 246. 区间最大公约数


下一篇:java使用createNewFile()方法时报错