> For the complete documentation index, see [llms.txt](https://hao-fu-1.gitbook.io/oj/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hao-fu-1.gitbook.io/oj/exhaustive-search/248.-strobogrammatic-number-iii.md).

# 248. Strobogrammatic Number III

对称数和回文很像，符合的定义也是从中间往两遍拓。要求返回所有的数目，DFS或DP。参考了[grandsong的题目和解法](https://link.zhihu.com/?target=https%3A//www.cnblogs.com/grandyang/p/5203228.html)，依次根据不同的可能长度发起遍历，当遍历到符合长度时检查首字母是否为0，和low长度相同时值是否小于low的值以及和high长度相同时值是否大于high的值。感觉还可以再优化，但没看到有人写出DP递推式。

```cpp
class Solution {
public:
    void dfs(string low, string high, string path, int len, int &res) {
        if (path.size() == len) {
            if (!(len != 1 && path[0] == '0') && 
                !(len == low.size() && path.compare(low) < 0) && 
                    !(len == high.size() && path.compare(high) > 0)) {
                ++res;
            }
            return;
        }
        dfs(low, high, "0" + path + "0", len, res);
        dfs(low, high, "1" + path + "1", len, res);
        dfs(low, high, "6" + path + "9", len, res);
        dfs(low, high, "8" + path + "8", len, res);
        dfs(low, high, "9" + path + "6", len, res);
    }

    int strobogrammaticInRange(string low, string high) {
        int res = 0;
        for (int i = low.size(); i <= high.size(); ++i) {
            dfs(low, high, "", i, res);
            dfs(low, high, "0", i, res);
            dfs(low, high, "1", i, res);
            dfs(low, high, "8", i, res);
        }
        return res;
    }    
}
```
