Source: https://www.cs.umd.edu/class/spring2018/cmsc330/lectures/02-automata.pdf