二刷
2种做法,indegree outdegree是一种。
public class Solution {
public boolean isValidSerialization(String preorder)
{
if(preorder.length() == 0) return true;
String[] noodArray = preorder.split(",");
int indegree = 0;
int outdegree = 1;
for(int i = 0; i < noodArray.length;i++)
{
if(outdegree - indegree < 1) return false;
char tempChar = noodArray[i].charAt(0);
if(tempChar == '#') indegree++;
else
{
outdegree+=2;
indegree++;
}
}
if(indegree == outdegree) return true;
else return false;
}
}
具体是判断能不能再添加了。
标准是outdegree - indegree > 0
OUT算是可用的,IN是用掉的,只要还有可用的,就可以继续添加。
然后最后out == in才行。
初始自动给个out =1 in = 0,给的那个1是为了添加ROOT的。
另一个方法是Stack。
因为是preOrder,所以push到stack过程中,如果数量多余3个,就有潜在的可以剪枝的机会,剪枝机会的表现是:
stack顶端的3个是
数字
。
说明这个子树是符合规定的,那么把这个子树直接变成1个#,然后push回去。
只在多余3的情况考虑。
最终STACK里剩下1个#就说明符合了。很新颖的思路,具体实现方法,一刷里有。
三刷。
记忆力不行,这个题记得是in/out degree来做的,这么做也确实方便。
没添加一个NODE会增加1个in-Degree,如果添加的不是null会增加2个out-Degree.
out-Degree > in-Degree说明有多余的out-Degree等待添加Node,所以可以继续添加。
注意初始是outDegree - inDgree = 1. 相当于初始给个支来添加Root..
然后添加的时候要先判断,再添加。。最后in-Degree == out-Degree才行。
public class Solution {
public boolean isValidSerialization(String preorder) {
if (preorder.length() == 0) return true;
int inDegree = 0;
int outDegree = 1;
for (String s : preorder.split(",")) {
inDegree ++;
if (outDegree - inDegree < 0) return false;
if (!s.equals("#")) outDegree += 2;
}
return inDegree == outDegree;
}
}
看二刷说第二个做法是preOrder,这样当栈顶是2个# #的时候,说明可以剪掉这个分支,这里的剪掉不是backtrack,是cut,cut your balls的cut。
挖槽,做了好久,里面的逻辑有点混乱。。
public class Solution {
public boolean isValidSerialization(String preorder) {
if (preorder.length() == 0) return true;
Stack<String> stk = new Stack<>();
String[] str = preorder.split(",");
for (int i = 0; i < str.length; i++) {
String s = str[i];
stk.push(s);
while (stk.size() >= 3 && s.equals("#")) {
String s1 = stk.pop();
String s2 = stk.pop();
String s3 = stk.pop();
if (s2.equals("#") && !s3.equals("#")) {
stk.push("#");
} else if (s2.equals("#") && s3.equals("#")) {
return false;
} else {
stk.push(s3);
stk.push(s2);
stk.push(s1);
break;
}
}
}
return stk.size() == 1 && stk.peek().equals("#");
}
}