WWWDOT-GOOGLE=DOTCOM

WWWDOT-GOOGLE=DOTCOM,

最终结果:

777589-188103=589486
777589-188106=589483

 

package com.wang.chars;

import java.util.Map;

import com.google.common.collect.Maps;

import lombok.Data;

public class SecretSum {

    @Data
    static class CharObj {

        private Character character;
        private boolean used;
        private int value;
    }

    public static void main(String[] args) {
        String[] parameters = { "wwwdot", "google", "dotcom" };
        // 对于每一个字符使用每一个数据
        Map charObjs = Maps.newHashMap();
        // 进行字符初始化
        init(parameters, charObjs);

        // 对于每一个字符应用每一个数字
        Character[] characters = {};
        characters = charObjs.keySet().toArray(characters);

        applyNumber(charObjs, characters, 0, parameters);
    }

    private static void applyNumber(Map charObjs, Character[] characters, int index, String[] parameters) {
        if (index == characters.length) {
            applyCalculation(charObjs, parameters);
            return;
        }
        CharObj charObj = charObjs.get(characters[index]);
        for (int i = 0; i < 10; i++) {
            if (isValidNumber(i, charObjs, characters, index)) {
                charObj.setValue(i);
                charObj.setUsed(true);
                applyNumber(charObjs, characters, index + 1, parameters);
            }
        }
    }

    private static void applyCalculation(Map charObjs, String[] parameters) {
        Integer number[] = { 0, 0, 0 };
        number[0] = getNumber(charObjs, parameters[0]);
        number[1] = getNumber(charObjs, parameters[1]);
        number[2] = getNumber(charObjs, parameters[2]);
        if (number[0] - number[1] == number[2]) {
            System.out.println(number[0] + "-" + number[1] + "=" + number[2]);
        }
    }

    private static Integer getNumber(Map charObjs, String string) {
        char[] characters = string.toCharArray();
        Integer number = 0;
        for (int i = 0; i < characters.length; i++) {
            number = number * 10 + charObjs.get(characters[i]).getValue();
        }
        return number;
    }

    // 不能使用前面已经使用过的字符
    private static boolean isValidNumber(int i, Map charObjs, Character[] characters, int index) {
        for (int j = 0; j < index; j++) {
            CharObj charObj = charObjs.get(characters[j]);
            if (charObj.getValue() == i) {
                return false;
            }
        }
        return true;
    }

    private static void init(String[] parameters, Map charObjs) {
        for (String parameter : parameters) {
            for (Character character : parameter.toCharArray()) {
                if (!charObjs.containsKey(character)) {
                    CharObj charObj = new CharObj();
                    charObj.setCharacter(character);
                    charObj.setUsed(false);
                    charObj.setValue(-1);
                    charObjs.put(character, charObj);
                }
            }
        }
    }
}

 

你可能感兴趣的:(算法,编程题)