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

Posted

技术标签:

【中文标题】从数字数组中查找可能的字母字符串数【英文标题】:Find Number of Possible Alphabet Strings from Number Array 【发布时间】:2016-01-02 21:33:03 【问题描述】:

给定一个字符串12345 和一个字母到数字的映射,例如a =1b =2..、y=25z=26;编写代码,从给定的字符串中找出可能的字母字符串的数量。

例如字符串12345 具有来自映射12-3-4-5, 1-23-4-5, 1-2-3-4-5 的可能的字母字符串lcde,awde, abcde

我对如何做到这一点有一个大致的了解。我想这将是递归的。查看第一个数字并将其 char 映射添加到结果中,然后使用子数组 (1, size - 1) 进行递归。还要查看前两个数字,看看它们是否

不过,我被困在了实际的实现上。有没有比递归更聪明的方法?

【问题讨论】:

你忘了问问题。 但分数是 2 :) 我不明白12345 是如何映射到lcde 的。能解释一下系统吗?也许,把系统解释清楚,不仅可以让别人告诉你怎么做,还可以启发你自己。 ;-) l = 12, c = 3, d = 4, e =5 【参考方案1】:

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

12-3-4-5, 1-23-4-5, 1-2-3-4-5 

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.

详情:

当您对say index i 进行递归调用时,当您完成此调用(基本上从当前递归返回)时,您已经使用/计算/找到了所有可能的值(从索引开始的子字符串的所有排列i)。你可以存储这些值,因为如果你会看到有时你会再次从其他索引比如j (j<i) 索引i。所以现在这一次你可以从这个地方本身返回,而不是更递归地调用索引i,因为你已经计算了索引i的值,不管j如何,这都是一样的

【讨论】:

不知道您所说的“计算当前索引的所有可能”是什么意思 @saleeeeen 查看我的更新。我已经添加了细节。我希望现在很清楚【参考方案2】:

完成这个编码,想法来自@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

【讨论】:

以上是关于从数字数组中查找可能的字母字符串数的主要内容,如果未能解决你的问题,请参考以下文章

输入一行字符(可能包含英文字母,数字字符等其他字符),要求统计其中单词的个数?

c语言 查找最大元素

JavaScript数字数组怎么按数字大小排序?

java字母和数字排列组合后

在Oracle中查找以字母数字开头的字符串

java编程 字母数和单词数问题