从数字数组中查找可能的字母串数

时间:2015-10-06 04:50:35

标签: c++ arrays string recursion

  

给定字符串12345和字母到数字映射,如a =1b =2 ..,y=25z=26;编写代码以查找给定字符串中可能的字母串数。

     

E.x。字符串12345的字母字符串可能来自映射{lcde,awde, abcde}中的{12-3-4-5, 1-23-4-5, 1-2-3-4-5}

我对如何做到这一点有一个大概的了解。我想这会是递归的。查看第一个数字并将其char映射添加到结果中,然后使用子数组(1,size-1)递归。还要查看两个第一个数字,看看它们是否为< = 26.如果是这样,将其添加到结果中并递归(2,size-2)。这样做直到数组数组为空。

我仍然坚持实际的实施。有没有比递归更聪明的方法呢?

2 个答案:

答案 0 :(得分:1)

这类似于断字问题。您可以使用相同的方法来解决它。您可以使用memoization来减少总体运行时间。如果您在给定的示例中看到:

<body>
<form>
<%
String cat=request.getParameter("category");
System.out.println("It is" +cat);
%>
</form>
</body>

4和5正在重复,你一次又一次地计算它。您可以在第一次计算时存储给定索引的排列,并在以后访问相同索引时使用它。

伪代码:

$to      =  $email_to;
$subject = 'Website Form';
$message = 'From: ' . $name . 

' \r\n Date: ' .  $date . 

' \r\nText: ' .  $text . 

'\r\n Use on Presentations?: ' . $presentations . 

'\r\n Use on Websites?: ' . $website . 

'\r\n Use on Case Studies?: ' . $casestudy;

$headers = 'From: website@website.com' . "\r\n" .
    'Reply-To: no-reply@website.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

<强>详情:

当您对index 12-3-4-5, 1-23-4-5, 1-2-3-4-5 进行递归调用时,当您完成此调用(基本上从当前递归返回)时,您已经使用/计算/找到了所有可能的值(子字符串开始的所有排列)在索引recursive_function(string,index) if you have already calculated values for this index in previous call return value recursive_function(string,index+1) if possible recursive_function(string,index+2) store this value for future use. )。您可以存储这些值,因为如果您看到有时您会再次从其他索引i开始索引i。所以现在这次你可以从这个地方本身返回,而不是对索引i进行更多的递归调用,因为你已经计算了索引j (j<i)的值,而且无论i是什么

答案 1 :(得分:0)

刚刚完成此编码,想法来自@dream_machine

基本上,它是一种回溯算法,复杂度为O(2n!), 需要一直跟踪left知道应该输出字符串。

似乎算法太慢,可能需要添加一些备忘录来加快速度。

 void helper(int start, string &s, string &path, vector<string> &result, int);

vector<string>
getPossibleCombo(string &s) {
    vector<string> result;
    string path;
    helper(0, s, path, result, s.size());
    return result;
}

void helper(int start, string &s, string &path, vector<string> &result, int left) {
    if (start == s.size() && left == 0) {
        result.push_back(path);
        return;
    }

    for (int i = start; i < s.size(); i++) {
        path.push_back('a' + (s[i] - '0') - 1);
        helper(i + 1, s, path, result, left - 1);
        path.pop_back();

        if (i < s.size() - 1 && s[i] > '0' && s[i] <= '2') { // can try two.
            if (s[i] == '2' && s[i+1] > '6')
                continue;
            int c = (s[i] - '0') * 10 + s[i + 1] - '0';
            path.push_back('a' + c - 1);
            helper(i + 2, s, path, result, left - 2);
            path.pop_back();
        }
    }
}

int main() {
    string s("12345");
    auto r = getPossibleCombo(s);
    for (auto &s : r) {
        cout << s << endl;
    }
}

输出

bash-3.2$ g++ -std=c++11 -g test2.cpp && ./a.out
abcde
awde
lcde