使用递归java的FindSpaces方法

时间:2017-03-15 19:18:08

标签: java recursion arrayofstring

我正在尝试编写一个接受字符串输入的方法,并通过检查字符串的某些部分是否与字典字匹配来返回包含逻辑空格的可能字符串列表。例如:

示例:

input: "becausetodayuseat" 
Output: {
    "be cause to day us eat ",
    "be cause to day use at ",
    "be cause today us eat ",
    "be cause today use at ",
    "because to day us eat ",
    "because to day use at ",
    "because today us eat ",
    "because today use at "
}

我的代码目前正在

public static String[] space(String[] dict, String s) {
    LinkedList<String> ret = new LinkedList<String>();

    // base case

    if (s.length() == 0) {
        String[] r = { "" };
        return r;
    }


    for (int i = 1; i < s.length(); i++) {
        String prefix = s.substring(0, i);
        if (inDictionary(dict, prefix)) {
            prefix = prefix + " ";
            ret.add(prefix);
            String suffix = s.substring(i);
            String[] end = space(dict,suffix);
            //System.out.println(end.length);
            for (int j = 0; j < end.length; ++j) {
                ret.add(end[j]);
            }

        }
    }

    // This line converts LinkedList<String> to String []
    return ret.toArray(new String[0]);

我知道for循环是问题,但我似乎无法找到错误。我打印出来了

be 
cause 
to 
day 
us 
use 
a 
today 
us 
use 
a 
because 
to 
day 
us 
use 
a 
today 
us 
use 
a 

非常感谢任何帮助:)

3 个答案:

答案 0 :(得分:0)

在没有提供实际实施的情况下进行思考:

在每一步我们都可以添加一个空格,或者不添加空格。我们可以将问题视为二叉树。在树的每一步,如果当前“活动序列”是一个单词,我们添加一个空格,我们也尝试不添加空格。我们来看看输入because

b不是一个字,所以我们继续"" + space("because")这是一个单词,所以我们现在有"be " + space("cause")space("because")

我们一直持续到基本情况。

答案 1 :(得分:0)

编辑:对不起,快速读取,它只给出一个结果。我再想一想

试试这个

public String parse(String s, HashMap<String, String> map,String dict[]) {
    if (map.containsKey(s)) {
        return map.get(s);
    }
    if (inDictionary(s)) {
        return s;
    }
    for (int left = 1; left < s.length(); left++) {
        String leftSub = s.substring(0, left);
        if (!inDictionary(leftSub)) {
            continue;
        }
        String rightSub = s.substring(left);
        String rightParsed = parse(rightSub, map,dict);
        if (rightParsed != null) {
            String parsed = leftSub + " " + rightParsed;
            map.put(s, parsed);
            return parsed;
        }
    }
    map.put(s, null);
    return null;
 }

要打电话给它:      Your_object.parse(Your_string,new HashMap(),Your_dict)

答案 2 :(得分:0)

您现在分别添加前缀和后缀。找到单词后,您需要将所有可能的后缀附加到其中,然后将其添加到您的收藏中。

伪代码:

if word found
    foreach end in ends
        result.add(word + ' ' + end)