Your parentheses are wrong in several places. Proper indentation can make these errors more clear:

    IF(
        CONTAINS(
            "Re-Admit...",
            LastName // <-- remove TEXT(...) call if this is a text field
        ), // <-- missing closing parenthesis added
        1, // <-- if your return type is Number, don't wrap the return value in quotes
        IF(
            CONTAINS(
                "Re-Admit 2...",
                LastName // <-- remove TEXT(...) call if this is a text field
            ), // <-- missing closing parenthesis added
            2, // <-- extra closing parenthesis removed
            // ^^^ if your return type is Number, don't wrap the return value in quotes
            IF(
                CONTAINS(
                    "Re-Admit 3...",
                    LastName // <-- remove TEXT(...) call if this is a text field
                ), // <-- missing closing parenthesis added
                3, // <-- extra closing parenthesis removed
                // ^^^ if your return type is Number, don't wrap the return value in quotes
                0 // <-- if your return type is Number, your fallback value should be 0 or null
            ) // <-- close third IF formula
        ) // <-- close second IF formula (added)
    ) // <-- close first IF formula (added)

I believe the first `CONTAINS` check will actually catch all the values from the subsequent checks, so you should also reverse the order, checking the `"1"` case last.