[Leetcode] 247. Strobogrammatic Number II 解题报告

题目

A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down).

Find all strobogrammatic numbers that are of length = n.

For example,
Given n = 2, return ["11","69","88","96"].

思路

这道题目既可以用回溯法完成,也可以用深度优先搜索完成。回溯法的解法相对比较普通,所以我们这里给出一种深度优先搜索的解法:

1)如果n是奇数,那么最中间一位只能是0,1或者8,所以我们首先递归地给出n的前一半的可能结果(此时后一半的对应结果也就已经确定了),然后把0,1或者8嵌在最中间就可以了。

2)如果n是偶数,那么只需要递归地给出n的前一半的可能结果(此时后一半的对应结果也就已经确定了),然后把0,1,8,6或者9加在最两边就可以了。

唯一需要小心的是:0不能出现在数字的首位。

代码

class Solution {
public:
    vector<string> findStrobogrammatic(int n) {
        // This version can make me better to understand the principle and idea of DFS
        if(n <= 0) {
            return {};
        }
        vector<string> result;
        dfs(n, "", result);  
        return result;
    }
private:
    void dfs(int n, string str, vector<string> &result) {
        if(n == 0) {
            return result.push_back(str);
        }
        if(n % 2 != 0) {
            for(auto val : same) {
                dfs(n-1, val, result);
            }
        }
        else {
            for(int i = (n == 2) ? 1 : 0; i < two.size(); ++i) {
                dfs(n-2, two[i].first + str + two[i].second, result);
            }
        }
    }
    vector<string> same{"0", "1", "8"};  
    vector<pair<char,char>> two{{'0','0'},{'1','1'},{'6','9'},{'8','8'},{'9','6'}};
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值