一段时间以来,我一直在研究这个示例问题,却想不出如何用Python以Python的方式解决它:
假设我有一个数字字符串,data = "124136"
从左到右遍历字符串,整数可以对应于字母(例如1 = {a
,12 = {l
,2 = b
,24 = { {1}})
我想算一下有多少种有效的字母编码(即,可以逐步遍历字符串而使多少个不同的一位数或两位数的块序列,每个块<= 26)。在Python中,如何遍历该字符串并查看每个数字和每一对?我正在寻找明智的,人类可读的Python,不一定是最巧妙的方法。
答案 0 :(得分:2)
您可以使用sliding_window功能并检查窗口中的所有组合(只有三种组合)
%macro column_exists(data=, target=);
%local check;
%let data_lib = %sysfunc(upcase(%sysfunc(scan("&data", 1, "."))));
%let data_data = %sysfunc(upcase(%sysfunc(scan("&data", 2, "."))));
%put &data_lib;
%put &data_data;
proc sql noprint;
select name into :check separated by " "
from dictionary.columns
where libname = "&data_lib" and
memname = "&data_data" and
upcase(name) = upcase("&target");
quit;
* RETURN LOGICAL/NUMERIC/CHAR VALUE *
%mend column_exists;
data _null_;
%let test = %column_exists(data=sashelp.cars, target=mpg_city);
if &test eq TRUE then %put 'ok'; else %put 'no';
run;
答案 1 :(得分:1)
这不是编码服务。但是,我们可以提供算法帮助。
要计算可用解决方案的数量,您需要遵循所有合法途径。我建议使用具有回溯和记忆功能(动态编程)的递归例程。
def code_ct(s):
# Base case: short string
# if string length is
0: return 0
1: return 1 unless digit is '0'; then return failure
# Otherwise, recur for the normal case
# Count 1-digit encoding branch:
# If this digit is 0, return 0
# Otherwise, consume this digit; recur on s[1:]
one_digit = count_end(s[1:])
# If the first *two* digits form a legal encoding, count that branch as well
# Consume two digits (to be 'j'-'z') and handle the remaining string.
if 10 <= int(str[:1]) <= 26:
two_digit = code_ct(str[2:])
total_ct = one_digit + two_digit
return total_ct
正确实施,这应该为您提供合法的编码量。 如果需要实际的编码,则需要使用编码或1/2位数字来检测返回值,并在爬回堆栈时积累解决方案。
您还仍然需要处理错误案例,按照自己的意愿检查失败,并作为练习留给学生。
对于任何长输入,如果您也实现了记忆,这将快。