中级农民
- 积分
- 115
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-10-16
- 最后登录
- 1970-1-1
|
能吧。。。先用dp数组记录prev index,然后逆向dfs。思路有点像word break II- void helper(vector<vector<int> >& dp, vector<string>& res, string& s, int cur, const string& ss) {
- if (cur == 0) {
- string tmp = s;
- reverse(tmp.begin(), tmp.end());
- res.push_back(tmp);
- return;
- }
- for (auto prevIdx: dp[cur]) {
- int offset = stoi(ss.substr(prevIdx, cur - prevIdx));
- char c = 'a' - 1 + offset;
- s.push_back(c);
- helper(dp, res, s, prevIdx, ss);
- s.pop_back();
- }
- }
- vector<string> decode(const string& s) {
- if (s.empty() || s[0] == '0')
- return {};
- vector<vector<int> > dp(s.size() + 1, {});
- dp[1].push_back(0);
- for (int i = 0; i < s.size() - 1; ++i) {
- char a = s[i];
- char b = s[i + 1];
- if (b == '0') {
- if (a == '0' || a >= '3') {
- return {};
- }
- dp[i + 2].push_back(i);
- }
- else if (a == '1' || (a == 2 && b <= '6')) {
- dp[i + 2].push_back(i + 1);
- dp[i + 2].push_back(i);
- }
- else {
- dp[i + 2].push_back(i + 1);
- }
- }
- vector<string> res;
- string ss;
- helper(dp, res, ss, s.size(), s);
- return res;
- }
复制代码 |
|