JavaScript (ES6), 266265 bytes
Saved 6 bytes thanks to @tsh
Expects an array of characters. Returns 0 for unambiguous, 1 for ambiguous, or 3-1 for impossible.
s=>s.reduce((p,c,i)=>p|=1/c||b?b=0:/[bcfhiknopsuvwy]/.test(c)-~+(b=/([ace][rsu]|[cgn][ade]|[iz][nr]|a[cglmt]|b[aehikr]|c[fl-o]|d[bsy]|f[elmr]|h[efgos]|kr|l[airuv]|m[cdgnot]|n[bhiop]|o[gs]|p[abdmortu]|r[abe-hnu]|s[bcegimnr]|t[abcehilms]|xe|yb)$/.test(c+s[i+1]))^2-1,b=0) How?
The variable \$p\$ holds the final result. The flag \$b\$ is set whenever a 2-character chemical symbol is matched.
For each character \$c\$ at position \$i\$ in the input array:
If \$c\$ is a digit or the flag \$b\$ is set, we clear \$b\$ and leave \$p\$ unchanged.
Otherwise, we compute:
p |= /E1/.test(c) + (b = /E2/.test(c + s[i + 1])) - 1where
/E1/and/E2/are regular expressions matching 1-character and 2-character chemical symbols respectively.Which leads to:
/E1/ matching | /E2/ matching | sum - 1 | meaning ---------------+---------------+---------+------------ no | no | -1 | impossible no | yes | 0 | unchanged yes | no | 0 | unchanged yes | yes | 1 | ambiguous