📌  相关文章
📜  查找由映射到数字的数字的字符组成的所有字符串

📅  最后修改于: 2022-05-13 01:57:07.084000             🧑  作者: Mango

查找由映射到数字的数字的字符组成的所有字符串

考虑下面的列表,其中从 1 到 9 的每个数字映射到几个字符。

1 -> ['A', 'B', 'C']
2 -> ['D', 'E', 'F']
3 -> ['G', 'H', 'I']
4 -> ['J', 'K', 'L']
5 -> ['M', 'N', 'O']
6 -> ['P', 'Q', 'R']
7 -> ['S', 'T', 'U']
8 -> ['V', 'W', 'X']
9 -> ['Y', 'Z'] 

给定一个数字,用给定列表中的相应字符替换其数字并打印所有可能的字符串。数字中每次出现的数字都应考虑相同的字符。输入数字为正数且不包含 0。

例子 :

Input : 121
Output : ADA BDB CDC AEA BEB CEC AFA BFB CFC

Input : 22
Output : DD EE FF 
 

这个想法是对于输入数字中的每个数字,我们考虑由前一个数字形成的字符串,并将映射到当前数字的字符附加到它们。如果这不是数字的第一次出现,我们会附加与第一次出现相同的字符。

C++
// C++ program to find all strings formed from a given
// number where each digit maps to given characters.
#include 
using namespace std;
  
// Function to find all strings formed from a given
// number where each digit maps to given characters.
vector findCombinations(vector input,
                                vector table[])
{
    // vector of strings to store output
    vector out, temp;
  
    // stores index of first occurrence
    // of the digits in input
    unordered_map mp;
  
    // maintains index of current digit considered
    int index = 0;
  
    // for each digit
    for (int d: input)
    {
        // store index of first occurrence
        // of the digit in the map
        if (mp.find(d) == mp.end())
            mp[d] = index;
  
        // clear vector contents for future use
        temp.clear();
  
        // do for each character thats maps to the digit
        for (int i = 0; i < table[d - 1].size(); i++)
        {
            // for first digit, simply push all its
            // mapped characters in the output list
            if (index == 0)
            {
                string s(1, table[d - 1].at(i));
                out.push_back(s);
            }
  
            // from second digit onwards
            if (index > 0)
            {
                // for each string in output list
                // append current character to it.
                for(string str: out)
                {
                    // convert current character to string
                    string s(1, table[d - 1].at(i));
  
                    // Imp - If this is not the first occurrence
                    // of the digit, use same character as used
                    // in its first occurrence
                    if(mp[d] != index)
                        s = str[mp[d]];
  
                    str = str + s;
  
                    // store strings formed by current digit
                    temp.push_back(str);
                }
  
                // nothing more needed to be done if this
                // is not the first occurrence of the digit
                if(mp[d] != index)
                    break;
            }
        }
  
        // replace contents of output list with temp list
        if(index > 0)
            out = temp;
        index++;
    }
  
    return out;
}
  
// Driver program
int main()
{
    // vector to store the mappings
    vector table[] =
    {
        { 'A', 'B', 'C' },
        { 'D', 'E', 'F' },
        { 'G', 'H', 'I' },
        { 'J', 'K', 'L' },
        { 'M', 'N', 'O' },
        { 'P', 'Q', 'R' },
        { 'S', 'T', 'U' },
        { 'V', 'W', 'X' },
        { 'Y', 'Z' }
    };
  
    // vector to store input number
    vector input = { 1, 2, 1};
  
    vector out = findCombinations(input, table);
  
    // print all possible strings
    for (string it: out)
        cout << it << " ";
  
    return 0;
}


Python3
# Python program to find all strings formed from a given
# number where each digit maps to given characters.
  
# Function to find all strings formed from a given
# number where each digit maps to given characters.
def findCombinations(input: list, table: list) -> list:
  
    # vector of strings to store output
    out, temp = [], []
  
    # stores index of first occurrence
    # of the digits in input
    mp = dict()
  
    # maintains index of current digit considered
    index = 0
  
    # for each digit
    for d in input:
  
        # store index of first occurrence
        # of the digit in the map
        if d not in mp:
            mp[d] = index
  
        # clear vector contents for future use
        temp.clear()
  
        # do for each character thats maps to the digit
        for i in range(len(table[d - 1])):
  
            # for first digit, simply push all its
            # mapped characters in the output list
            if index == 0:
                s = table[d - 1][i]
                out.append(s)
  
            # from second digit onwards
            if index > 0:
  
                # for each string in output list
                # append current character to it.
                for string in out:
  
                    # convert current character to string
                    s = table[d - 1][i]
  
                    # Imp - If this is not the first occurrence
                    # of the digit, use same character as used
                    # in its first occurrence
                    if mp[d] != index:
                        s = string[mp[d]]
  
                    string = string + s
  
                    # store strings formed by current digit
                    temp.append(string)
  
                # nothing more needed to be done if this
                # is not the first occurrence of the digit
                if mp[d] != index:
                    break
  
        # replace contents of output list with temp list
        if index > 0:
            out = temp.copy()
        index += 1
    return out
  
# Driver Code
if __name__ == "__main__":
  
    # vector to store the mappings
    table = [['A', 'B', 'C'],
            ['D', 'E', 'F'],
            ['G', 'H', 'I'],
            ['J', 'K', 'L'],
            ['M', 'N', 'O'],
            ['P', 'Q', 'R'],
            ['S', 'T', 'U'],
            ['V', 'W', 'X'],
            ['Y', 'Z']]
  
    # vector to store input number
    input = [1, 2, 1]
    out = findCombinations(input, table)
  
    # print all possible strings
    for it in out:
        print(it, end=" ")
  
# This code is contributed by
# sanjeev2552


输出 :
ADA BDB CDC AEA BEB CEC AFA BFB CFC