编码一串数字(递归吗?)

时间:2018-12-04 22:12:52

标签: python string recursion

一段时间以来,我一直在研究这个示例问题,却想不出如何用Python以Python的方式解决它:

假设我有一个数字字符串,data = "124136"

从左到右遍历字符串,整数可以对应于字母(例如1 = {a,12 = {l,2 = b,24 = { {1}})

我想算一下有多少种有效的字母编码(即,可以逐步遍历字符串而使多少个不同的一位数或两位数的块序列,每个块<= 26)。在Python中,如何遍历该字符串并查看每个数字和每一对?我正在寻找明智的,人类可读的Python,不一定是最巧妙的方法。

2 个答案:

答案 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位数字来检测返回值,并在爬回堆栈时积累解决方案。

您还仍然需要处理错误案例,按照自己的意愿检查失败,并作为练习留给学生。

对于任何长输入,如果您也实现了记忆,这将