1
maosengshulei 2017-12-27 13:47:18 +08:00 via Android
DFS?
|
2
coderluan 2017-12-27 14:19:08 +08:00
我感觉想多了,没提复杂度,直接套循环就完了,3 的 7 次方也就 2000 多行而已,想让代码好看你弄个递归。
|
3
coderluan 2017-12-27 14:21:24 +08:00
PS : 你的分析我一个都看不明白,一行一个对着问题有啥影响,存文本又是闹哪样,你先把结果存个数组里不行吗?
|
4
rrfeng 2017-12-27 14:25:32 +08:00 via Android
这玩意儿需要什么数据结构??!
|
5
hoyixi 2017-12-27 14:40:37 +08:00
lz 截图该把题干截完整,你转述是你自己的理解和你自己的语言。
|
6
MSilen 2017-12-27 14:41:04 +08:00 via Android 1
void wtf(String phone,String result){
if(null==phone||phone.equals("")){ 打印 result; return; } char a=获取 phone 第一个 char; 遍历 a 对应的三个字母{ wtf(phone 去掉第一个,result 加上遍历的字母); } } 差不多这样吧 |
7
GeruzoniAnsasu 2017-12-27 14:57:30 +08:00 1
这东西是递归解的,这么说明不明白?
Encode( prefix,numberSeries ) { if(numberSeries == end()){ output(prefix); return; } curNumber = numberSeries[0]; for(letter in letterTable[curNumber]){ prefix=prefix+letter; Encode( prefix,numberSeries+1 ); } } |
8
ZZZZone 2017-12-27 16:21:07 +08:00
三种情况暴搜吧, 数字转字符处理一下就行。
#include <cstdio> #include <cstring> #include <string> #include <iostream> using namespace std; string s; int len; void dfs(string t, int tot){ if(tot == len){ cout << t << endl; return; } int x = (s[tot] - '0'); x = (x - 2) * 3; dfs(t + (char)(x+'A'), tot + 1); dfs(t + (char)(x+1+'A'), tot + 1); dfs(t + (char)(x+2+'A'), tot + 1); } int main(){ cin >> s; len = s.length(); dfs("", 0); } |
9
SaulLawliet 2017-12-27 16:29:55 +08:00
|
10
ofblyt 2017-12-27 16:31:25 +08:00
这个就是 dfs 和 backtrace 吧,正好最近在看 leetcode
|
11
zhujinliang 2017-12-27 16:52:05 +08:00
我一般这样解决:
把结果看作 3 进制的数字,0,1,2 分别对应三个字母,对整个数字不断自增 1,最终就可以遍历所有的可能 比如 234,是 "ABC" "DEF" "GHI" 的所有可能组合 0 对应 3 进制 000 第一位 0 对应 A 第二位 0 对应 D 第三位 0 对应 G 1 对应 3 进制 001 第一位 1 对应 B 第二位 0 对应 D 第三位 0 对应 G 2 对应 3 进制 002 第一位 2 对应 C 第二位 0 对应 D 第三位 0 对应 G 3 对应 3 进制 010 第一位 0 对应 A 第二位 1 对应 E 第三位 0 对应 G 4 对应 3 进制 011 第一位 1 对应 B 第二位 1 对应 E 第三位 0 对应 G 依次类推 手头没有 C 工具,用 go 撸了个 https://play.golang.org/p/ibNWC9QhBcj |