【问题标题】:FindSpaces method using recursion java使用递归java的FindSpaces方法
【发布时间】:2017-03-15 19:18:07
【问题描述】:

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

例子:

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 

任何帮助将不胜感激:)

【问题讨论】:

  • 注意详细说明什么不适合您。我在您的帖子中没有看到任何问题
  • 我重新格式化了预期和实际输出;我希望能澄清一些事情。
  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。具体来说,您发布的代码应该产生给定的输出。你的不能自己运行。
  • 我建议你编写一个驱动程序来构建一个小字典并调用你的例程。还要插入一些有用的跟踪打印语句来显示程序流中发生的事情。

标签: java recursion arrayofstring


【解决方案1】:

在不提供实际实现的情况下仔细考虑:

在每个步骤中,我们可以添加空格,也可以不添加空格。我们可以把这个问题想象成一棵二叉树。如果当前“活动序列”是一个单词,我们在树的每一步都添加一个空格,并且我们也尝试不添加空格。我们看输入because

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

我们继续直到基本情况。

【讨论】:

    【解决方案2】:

    编辑:抱歉,请快速阅读,它只给出一个结果。我再想想

    试试这个

    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)

    【讨论】:

      【解决方案3】:

      您现在分别添加前缀和后缀。找到一个单词后,您需要为其添加所有可能的后缀,然后将其添加到您的集合中。

      伪代码:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-02
        • 1970-01-01
        • 2014-03-04
        • 2017-02-28
        • 1970-01-01
        • 2014-05-03
        • 1970-01-01
        相关资源
        最近更新 更多