通过使用动态编程转换int提供的字典来提供所有可能的字符串。

时间:2015-10-20 18:31:18

标签: algorithm dynamic-programming

字典= {1:' A',2:' B',3:' C&#39,4:' d'                        .........,26:' z' }

实施例。 123可以转换为:" abc"(1 - ' a',2 - ' b',3 - ' c');                             " AW" (1 - ' a',23 - ' w');                             " LC" (12 - '升',3 - ' C&#39)

可以轻松获得递归解决方案

public class google {

    public static void googly(int a){
        String dict[] ={"","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"};
        String s="";      // to store the possible combinations
        StringBuilder N= new StringBuilder(Integer.toString(a));    // for easier access to numbers
        printstr(dict,0,N,s);

    }
    /* pos- current position in N
      res- store possible combinations */

    private static void printstr(String[] dict,int pos,StringBuilder N,String res) {
        // print if all the elements in N are done
        if(pos==N.length()){
            System.out.println(res);
            return;
        }
        // consider only one element at position pos in N
        printstr(dict,pos+1,N,res+dict[Integer.parseInt(N.substring(pos, pos+1))]);

        // consider next two elements if present and have a value in dict
        if(pos+1<N.length()){
            int a=Integer.parseInt(N.substring(pos,pos+2));
            if(a<26)
            printstr(dict,pos+2,N,res+dict[a]); 
        }

    }

    public static void main(String[] args){
        google.googly(123);
    }
}

但我无法找到使用动态编程的解决方案。

1 个答案:

答案 0 :(得分:0)

这是一个递归解决方案。我无法想出一个需要记忆(动态编程)解决方案的数字......在问题中我不清楚零会发生什么,所以我只是把它弄为空白而且必须考虑到为此单独。

import java.util.ArrayList;
import java.util.HashMap;

public class Main {

    static HashMap<Integer, String> INT_MAP = new HashMap<Integer, String>() {{
        put(0 , "");
        put(1 , "a");
        put(2 , "b");
        put(3 , "c");
        put(4 , "d");
        put(5 , "e");
        put(6 , "f");
        put(7 , "g");
        put(8 , "h");
        put(9 , "i");
        put(10, "j");
        put(11, "k");
        put(12, "l");
        put(13, "m");
        put(14, "n");
        put(15, "o");
        put(16, "p");
        put(17, "q");
        put(18, "r");
        put(19, "s");
        put(20, "t");
        put(21, "u");
        put(22, "v");
        put(23, "w");
        put(24, "x");
        put(25, "y");
        put(26, "z");
    }};

    public static void main(String[] args) {
        String num = Integer.toString(123);
        ArrayList<String> strings = new ArrayList<String>();
        getString(num, 0, num.length(), strings);
        for (String s : strings) {
            System.out.println(s);
        }
    }

    public static void getString(String s, int start, int end, ArrayList<String> strings) {
        if (end <= start) {
            strings.add(s);
            return;
        }

        // Convert first two numbers
        if (end-start >= 2) {
            String subStr = s.substring(start, start+2);
            int i = Integer.parseInt(subStr);
            if (i <= 26) {
                StringBuilder next = new StringBuilder(s.substring(0, start));
                String alpha = INT_MAP.get(i);
                next.append(alpha);
                if (start + 2 <= end) {
                    next.append(s.substring(start + 2, end));
                }

                if (i == 0 && alpha.length() == 0) {
                     getString(next.toString(), start, end - 2, strings);
                } else {
                    getString(next.toString(), start + 1, end - 1, strings);
                }

            }
        }

        // Convert first number
        int i = Integer.parseInt("" + s.charAt(start));
        StringBuilder next = new StringBuilder(s.substring(0, start));
        String alpha = INT_MAP.get(i);
        next.append(alpha);
        if (start + 1 <= end) {
            next.append(s.substring(start + 1, end));
        }
        if (i == 0 && alpha.length() == 0) {
            getString(next.toString(), start, end - 1, strings);
        } else {
            getString(next.toString(), start + 1, end, strings);
        }

    }
}

适合我。警告,未经过广泛测试。 - https://repl.it/BSTm/1