public class Solution {
/*
* @param s: A string
* @return: A list of lists of string
*/
public List<List<String>> partition(String s) {
List res = new ArrayList();
List<String> strs = new ArrayList<>();
dfs(s,res,strs);
return res;
}
public void dfs(String s,List res, List<String> strs)
{
if(s.length()==0||s==null) res.add(strs);//!!!
for(int i=0;i<s.length();i++)
{ String str = s.substring(0,i+1);
if(isTrue(str)) strs.add(str);
else continue;
dfs(s.substring(i+1,s.length()),res, strs);
strs.remove(strs.size()-1);//很重要!!!
}
}
public boolean isTrue(String s)
{
for(int i=0;i<s.length()-i;i++)
{if(s.charAt(i)==s.charAt(s.length()-1-i)) ;
else return false;
}
return true;
}
}
上面的代码执行结果是错误的,原因在于我标注!!!的地方。
将其改成res.add(new ArrayList<String>(strs))结果就是正确的。
我百思不得其解,于是到eclipse中进行调试寻找原因。
终于发现,add(strs)添加的是strs指向的list,而在执行完dfs后还有一句是strs.remove(),虽然res添加的是strs,但是当strs的值改变的时候,res里的strs的值也改变了。这也是为什么要重新创建一个等于strs的对象来加入到res中的原因。