Ranges should work quite ok for the problem, as long as there is a single state per range. This can be achieved using a LEFT
range with the values listed in alphabetical order.
If required, you could also add a check constraint to limit the values to valid state names;
CREATE PARTITION FUNCTION bop (CHAR(2)) AS
RANGE LEFT FOR VALUES('AK', 'AL', 'AR', 'AZ', ...)
END;