检查给定的字符串是否可以由给定的一组字符串组成

时间:2019-08-10 06:22:52

标签: java string dynamic-programming

如何检查给定的字符串是否可以由给定的一组字符串组成?在给定的字符串集中,任何字符串都可以使用任意次,只有这些字符串不能被拆分。”

For e.g.,
given set of strings are:
<aaa, hh, aa, rr>

Strings to check:
rraaahh :: returns True
raahh :: returns False
aarrr :: returns True

下面,我编写了一个函数,该函数从一组字符串中选择任意两个字符串,并检查给定的字符串是否可以由所选字符串组成。

但是我如何处理一次要使用两个以上字符串的情况,而任何一个字符串都可以多次使用。

static boolean isPossible(Vector<String> v, String str) 
{ 

    // Sort the given string 
    str = sortString(str); 

    // Select two strings at a time from given vector 
    for (int i = 0; i < v.size() - 1; i++) 
    { 
        for (int j = i + 1; j < v.size(); j++) 
        { 

            // Get the concatenated string 
            String temp = v.get(i) + v.get(j); 

            // Sort the resultant string 
            temp = sortString(temp); 

            // If the resultant string is equal 
            // to the given string str 
            if (temp.compareTo(str) == 0) 
            { 
                return true; 
            } 
        } 
    } 

    // No valid pair found 
    return false; 
}

2 个答案:

答案 0 :(得分:0)

简单检查字符串输入是否包含列表中的子字符串。如果剩下任何字母,则不会由那些子字符串组成,并返回false。尝试如下代码。

public static void main(String[] args) {

    String input = "aarr";

    ArrayList<String> list = new ArrayList<String>() {{
        add("aaa");
        add("hh");
        add("aa");
        add("rr");
    }};

    System.out.println(isPossible(list, input));

}

static boolean isPossible(ArrayList<String> list, String input) { 

    int count = 4;

    for (String item : list) {
        if (input.contains(item)) {
            input = input.replace(item, "");
            System.out.println("Debug: " + input);
        }
    }

    if ((int) input.length() == 0) {
        System.out.println("Pass: " + input.length());
        return true;
    } else {
        System.out.println("Fail: " + input.length());
    }

    return false;

}

答案 1 :(得分:0)

简单替换不起作用,因为“ aaaa”始终始终与“ aaa”匹配,仅剩下“ a”。但是您可以递归地解决它。

    public static void main(String[] args) {

    String input = "aaaarrrraahhaaa";

    ArrayList<String> list = new ArrayList<String>() {
        {
            add("aaa");
            add("hh");
            add("aa");
            add("rr");
        }
    };

    System.out.println(isPossible(list, input));

}

static boolean isPossible(List<String> fragments, String input) {
    return isOkay(fragments, input, "");
}

private static boolean isOkay(List<String> list, String input, String candidate) {
    for (int i = 0; i < list.size(); i++) {
        String testee = candidate + list.get(i);
        if (testee.equals(input)) {
            return true;
        }
        if (input.startsWith(testee)) {
            boolean tempResult = isOkay(list, input, testee);
            if (tempResult) {
                return true;
            }
        }
        testee = candidate;
    }
    return false;
}