方法一:
满足以下两点才是有效的
1.遍历一遍字符串,#的次数=数字的次数+1
2.在遍历过程中,#的次数一定<=数字次数
class Solution {
public:
vector<string> ans;
void func(string s){
s+=',';
string cur="";
for(auto i:s){
if(i!=',') cur+=i;
else{
ans.push_back(cur);
cur="";
}
}
}
bool isValidSerialization(string preorder) {
int c1=0,c2=0;
func(preorder);
for(int i=0;i<ans.size();i++){
if(ans[i]=="#") c1+=1;
else c2+=1;
if(c1>c2 && i!=ans.size()-1) return false;
}
return c1==c2+1;
}
};
方法二:如果在数字后面是连续两个 ‘#’,那么就将这三个元素替换成一个 ‘#’,这个过程一直持续到数组遍历结束。
最后,判断数组长度是否为 1,且数组唯一的元素是否为 ‘#’ 即可。
class Solution {
public:
vector<string> ans;
void func(string s){
s+=',';
string cur="";
for(auto i:s){
if(i!=',') cur+=i;
else{
ans.push_back(cur);
cur="";
}
}
}
bool isValidSerialization(string preorder) {
vector<string> st;
func(preorder);
for(auto i:ans){
st.push_back(i);
while(st.size()>2 && st[st.size()-1]=="#" && st[st.size()-2]=="#"&& st[st.size()-3]!="#"){
st.pop_back();
st.pop_back();
st.pop_back();
st.push_back("#");
}
}
return st.size()==1 && st[0]=="#";
}
};