如何防止断字的无限循环

时间:2013-10-31 19:08:08

标签: java

public boolean wordBreak(String s, Set<String> dict) {

    if(s.length()==0)  return true;

    String first = null;
    boolean isOk= false;

    for(int i=1; i<s.length(); i++){
        first = s.substring(0,i);
        if(dict.contains(first)){
            String remaining = s.substring(i);
            isOk = wordBreak(remaining, dict);
            if(dict.contains(remaining))
                isOk=true;
            if(isOk)
                return isOk;

        }
    }

    return false;
}

我无法通过案例的无限循环: “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab”

执行输入:[“a”,“aa”,“aaa”,“aaaa”,“aaaaa”,“aaaaaa”,“aaaaaaa”,“aaaaaaaa”,“aaaaaaaa”,“aaaaaaaaa”] 任何人都可以帮我指出逻辑中的错误吗?感谢

1 个答案:

答案 0 :(得分:1)

你没有无限循环,你有无限递归。这是因为当您使用String调用此方法时,您要做的第一件事就是使用相同的字符串调用自身。

你也检查过contains()几次,但你永远不会更新dict,所以不清楚这是真的。

  

执行输入:[“a”,“aa”,“aaa”,“aaaa”,“aaaaa”,“aaaaaa”,“aaaaaaa”,“aaaaaaaa”,“aaaaaaaa”,“aaaaaaaaa”]任何人都可以帮助我指出逻辑中的错误?

一些要点

  • 您不会在任何地方更新dict
  • 使用相同的参数调用相同的函数,因此它将不停地重复。
  • 如果这就是你所需要的,循环或一对循环会更简单,更有可能发挥作用。

我不确定它到底做了什么,但你可以做的是

public void wordBreak(String s, Set<String> dict) {
    for(int i = 0; i < s.length(); i++)
        for(int j = i + 1; j < s.length(); j++)
            dict.add(s.substring(i, j));
}